解决C/C++堆溢出(stack overflow)的问题

更新: 2016-08-15 16:27 作者:

工作中用Visual Studio 2008编写C++应用程序时,遇到了堆溢出(stack overflow)的问题,尝试了三种解决方法,下面分分享下三种方法的利弊、适用情况和效果。

解决C/C++堆溢出(stack overflow)的问题

1 最直接的方法,在VS2008开发环境下通过修改堆栈的最大空间来解决问题,默认是1M,你可以加大到10M试试.

具体的操作步骤如下:项目-》属性-》链接器-》系统-》堆栈保留大小

方法一操作简单,效果直接,针对小程序可以暂时解决问题,但不是长久之策,还是要从程序本身找问题。

解决C/C++堆溢出(stack overflow)的问题

解决C/C++堆溢出(stack overflow)的问题

2 在函数的递归调用中,函数中变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,遇到这种情况更改堆栈的最大空间大小是没有用的,要从代码的优化入手。

2.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.2 解决递归调用堆栈溢出问题,另外一种方法是在定义递归函数时,输入变量地址,通过指针操作,而非变量本身参加函数的递归调用,不会不断占用堆栈空间不释放。以自己程序定义的函数为例,从图中可以看出MaxTemperatureCal()函数和 LocationToIndex()函数的输入变量里都有结构体devinfo,在MaxTemperatureCal()函数中存在结构体devinfo的递归调用,如果直接按照图中输入变量,程序会报堆栈溢出的问题,修改后的程序截图如图2, LocationToIndex()函数的输入变量为&devinfo。

解决C/C++堆溢出(stack overflow)的问题

解决C/C++堆溢出(stack overflow)的问题

3 堆栈的大小只有1M,如果在函数中定义了一个占用内存比较大的变量,那么也会导致堆栈溢出。

3.1 这种情况只需在定义的时候定义为静态变量就行了,因为静态变量是不占用堆栈内存的。如:

void main()

{

       int a[10010010];

}

3.2 在函数内定义的变量默认auto类型,也就是栈变量,运行时使用的是栈空间,函数结束后自动清理返回内存。这里在函数内定义如此大的一个数组,已经超过了单个函数可使用的最大栈空间,也会提示stack overflow。解决办法是将其定义为static int型的静态变量,这样就不占用栈空间了。

void main()

{

       static int a[10010010];

}