加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:57:58 所属栏目:百科 来源:网络整理
导读:一般遇到这个问题,有两个常见的情况,一个是存在函数的递归调用,另一个是函数中定义了一个较大的数组或者别的变量。? 1、在函数的递归调用中,函数中定义的局部变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,解决这一问

一般遇到这个问题,有两个常见的情况,一个是存在函数的递归调用,另一个是函数中定义了一个较大的数组或者别的变量。?


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];?

?

1


? }????

? 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。?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读