文档章节

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

滴酱
 滴酱
发布于 2015/02/25 11:21
字数 566
阅读 62
收藏 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
5.6K
39
2009-2017 StackOverflow 编程语言流行趋势

Stack Overflow 发布了一个全新的 Trends 工具,根据 Stack Overflow 每月问题数量,用来跟踪对编程语言和技术的兴趣趋势。 工具预设的编程语言流行趋势,可以发现一些有意思的走向。 C# Jav...

王练
2017/05/15
4.3K
25
StackOverflow 数据分析:JavaScript 框架的残酷生命周期

本文由 Stack Overflow 的员工撰写,他通过 Stack Overflow 的趋势工具和他们的内部流量数据,分析了主流的 JavaScript 框架有着怎样的兴盛起衰,以及背后的一些原因。 新的 JavaScript UI ...

局长
01/12
2.7K
10
如何用 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
IEEE Spectrum 2014 年度编程语言排名

IEEE Spectrum通过跟踪Google搜索和趋势、社交网站如Stack Overflow、Twitter、Reddit和Hacker News上的相关讨论,GitHub上的项目,以及工作招聘等信息,分析了49种编程语言的流行度,公布了...

oschina
2014/07/02
7K
44

没有更多内容

加载失败,请刷新页面

加载更多

多线程的实现方式

多线程是指 一个程序运行时,产生或使用了不止一个线程。 线程的生命周期是怎么样的,下面这张图我们可以看出些端倪: 这章我们主要讨论多线程实现的方式,基础知识部分我们可以下来再恶补。...

搬砖大侠
5分钟前
0
0
新人千万不要在 Windows 上使用 Ruby on Rails

标题:新人千万不要在 Windows 上使用 Ruby on Rails 副标题:鼓励新人在 Linux 和 Mac 上使用 Ruby on Rails ! 原则:要走寻常路,不要学美特斯邦伟! "在 Windows上 使用 Ruby on Rails "是...

Jason909
13分钟前
0
0
day177-2018-12-14-英语流利阅读-待学习

艾滋病的治愈方法是否触手可及? Daniel 2018-12-14 1.今日导读 几十年来,艾滋病一直是世界上最难对付的“超级绝症”之一,从人类历史上第一次诊断出艾滋病病例的 20 世纪 80 年代早期到 20...

飞鱼说编程
39分钟前
7
0
java 合成两张图片或图片与二维码

java中偶尔会出现需要将一张小图片嵌入大图中或带二维码的海报图片,那么本文就是奔着这个目的来的,直接上腊肉! zxing是生成1D和2D条形或二维码的工具类库,java图形库Graphics2D进行图片的...

貔貅叔
44分钟前
4
0
80后阿里P10,“关老板”如何带着MaxCompute一路升级?

我是个幸运的人。虽然幸运不能被复制,但是眼光和努力可以。 关涛/关老板,80后的阿里P10,阿里巴巴通用计算平台负责人,阿里巴巴计算平台研究员。12年职场人生,微软和阿里的选择。 关涛的花...

阿里云官方博客
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部