文档章节

如何解决C/C++中stack overflow问题

滴酱
 滴酱
发布于 2015/02/25 11:21
字数 566
阅读 56
收藏 0



一般遇到这个问题,有两个常见的情况,一个是存在函数的递归调用,另一个是函数中定义了一个较大的数组或者别的变量。
1、在函数的递归调用中,函数中定义的局部变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,解决这一问题的办法是在递归函数中每次动态的分配变量的内存,在使用结束的时候释放内存。遇到这种情况更改堆栈的最大空间大小是没有用的,要从代码的优化入手。下面以二维数组的动态分配为例:
p=new double*[1000]; 

 for (int m=0;m<1000;m++)   {     
p[m]=new double[5000];   

}        for(int n=0;n<1000;n++)

  { 

  delete[] p[n];


  }   

  delete[] p;     
2、堆栈的大小只有1M,如果在函数中定义了一个占用内存比较大的变量,那么也会导致堆栈溢出。这种情况只需在定义的时候定义为静态变量就行了,因为静态变量是不占用堆栈内存的。如:
void main() {  int a[10010010]; }
在函数内定义的变量默认auto类型,也就是栈变量,运行时使用的是栈空间,函数结束后自动清理返回内存。这里在函数内定义如此大的一个数组,已经超过了单个函数可使用的最大栈空间,所以也会提示stack overflow。解决办法是将其定义为static int型的静态变量,这样就不占用栈空间了。
void main() {  static int a[10010010]; }
3、除此之外还可以通过修改堆栈的最大空间来解决问题,把project设置里的堆栈加大就可以了,默认是1M,你可以加大到10M试试.   具体如下:project-> setting-> link:   在category里选择output,在stack的Reserve里输入0x10000000试试。对于遇到这样的问题建议从代码方面去解决,不要盲目的依靠修改堆栈空间来解决,毕竟有的问题靠修改空间是解决不了的,如递归中产生的stack overflow。


本文转载自:http://wenku.baidu.com/link?url=AoFH3l930-5eaFyDXvDTZgksaEKC32xS8_dqk9QVO3lb_tAnhCtafS2Z_VC61Cv_b...

共有 人打赏支持
滴酱
粉丝 2
博文 6
码字总数 1095
作品 0
苏州
程序员
获得成就!Stackoverflow 已帮助一百万个开发者“退出” Vim

Stack Overflow 在其博客上表示,Stack Overflow 上一个流行的问题 — “如何退出 Vim(How to exit the Vim editor)”已经达到一个里程碑的阶段,目前已超过一百万用户浏览过这个问题。 St...

局长
2017/05/24
0
39
如何用 C++ 为 Python 写 dll

如何用 C++ 为 Python 写 dll 来自: http://zhongwei-leg.iteye.com/blog/693519 博客分类: C++ CC#C++PythonOS 1. 先新建一个名为 hello.cpp 的 C++ 源文件: #include <stdio.h> #define......

FreeBlues
2012/07/17
0
0
linux下使用 boost.python 调用c++动态库

最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面。测试办法是让 robot framework 通过 SSHLIbrary 库执行远程机器上...

问天小凯
08/01
0
0
C语言/C++编程学习:栈的代码实现之数组方案

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你学知识
06/14
0
0
C语言编程知识学习:if语句对出错的处理

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用户体验要素——以用户为设计中心

一、用户体验是什么 产品会与外界发生联系,人们如何去使用产品,人们使用产品无非解决两种问题,一,提高效率;二娱乐。而用户体验兼顾着功能和界面两个方面,为的是“提高人们的工作效率”...

铸剑为犁413
37分钟前
0
0
学习设计模式——代理模式

1. 认识代理模式 1. 定义:为其他对象提供一种代理以控制对这个对象的访问。 2. 组织结构: Proxy:代理对象,要实现与目标代理对象的相同的接口,这样就可以使用代理来代替具体的目标对象,...

江左煤郎
59分钟前
1
0
java JDK动态代理

本篇随笔是对java动态代理中的JDK代理方式的具体实现。 首先需要定义一个接口,为其定义了两个方法:   public interface UserService { public void add(); public void delete(); } 然后需...

编程SHA
今天
2
0
轻松理解Dubbo分布式服务框架

Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的...

别打我会飞
今天
2
0
TypeScript基础入门之JSX(一)

转发 TypeScript基础入门之JSX(一) 介绍 JSX是一种可嵌入的类似XML的语法。 它旨在转换为有效的JavaScript,尽管该转换的语义是特定于实现的。 JSX在React框架中越来越受欢迎,但此后也看到了...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部