如何解决C/C++中stack overflow问题
2016-01-26 19:28
246 查看
一般遇到这个问题,有两个常见的情况,一个是存在函数的递归调用,另一个是函数中定义了一个较大的数组或者别的变量。
1、在函数的递归调用中,函数中定义的局部变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,解决这一问题的办法是在递归函数中每次动态的分配变量的内存,在使用结束的时候释放内存。遇到这种情况更改堆栈的最大空间大小是没有用的,要从代码的优化入手。下面以二维数组的动态分配为例:
p=newdouble*[1000];
for (intm=0;m<1000;m++)
{
p[m]=new double[5000];
}
for(int n=0;n<1000;n++) { delete[] p
;
} delete[] p;
2、堆栈的大小只有1M,如果在函数中定义了一个占用内存比较大的变量,那么也会导致堆栈溢出。这种情况只需在定义的时候定义为静态变量就行了,因为静态变量是不占用堆栈内存的。如:
void main()
{
int a[10010010];
}
在函数内定义的变量默认auto类型,也就是栈变量,运行时使用的是栈空间,函数结束后自动清理返回内存。这里在函数内定义如此大的一个数组,已经超过了单个函数可使用的最大栈空间,所以也会提示stack overflow。解决办法是将其定义为staticint型的静态变量,这样就不占用栈空间了。
void main()
{
static int a[10010010];
}
3、除此之外还可以通过修改堆栈的最大空间来解决问题,把project设置里的堆栈加大就可以了,默认是1M,你可以加大到10M试试. 具体如下:project-> setting-> link: 在category里选择output,在stack的Reserve里输入0x10000000试试。对于遇到这样的问题建议从代码方面去解决,不要盲目的依靠修改堆栈空间来解决,毕竟有的问题靠修改空间是解决不了的,如递归中产生的stack overflow。
1、在函数的递归调用中,函数中定义的局部变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,解决这一问题的办法是在递归函数中每次动态的分配变量的内存,在使用结束的时候释放内存。遇到这种情况更改堆栈的最大空间大小是没有用的,要从代码的优化入手。下面以二维数组的动态分配为例:
p=newdouble*[1000];
for (intm=0;m<1000;m++)
{
p[m]=new double[5000];
}
for(int n=0;n<1000;n++) { delete[] p
;
} delete[] p;
2、堆栈的大小只有1M,如果在函数中定义了一个占用内存比较大的变量,那么也会导致堆栈溢出。这种情况只需在定义的时候定义为静态变量就行了,因为静态变量是不占用堆栈内存的。如:
void main()
{
int a[10010010];
}
在函数内定义的变量默认auto类型,也就是栈变量,运行时使用的是栈空间,函数结束后自动清理返回内存。这里在函数内定义如此大的一个数组,已经超过了单个函数可使用的最大栈空间,所以也会提示stack overflow。解决办法是将其定义为staticint型的静态变量,这样就不占用栈空间了。
void main()
{
static int a[10010010];
}
3、除此之外还可以通过修改堆栈的最大空间来解决问题,把project设置里的堆栈加大就可以了,默认是1M,你可以加大到10M试试. 具体如下:project-> setting-> link: 在category里选择output,在stack的Reserve里输入0x10000000试试。对于遇到这样的问题建议从代码方面去解决,不要盲目的依靠修改堆栈空间来解决,毕竟有的问题靠修改空间是解决不了的,如递归中产生的stack overflow。
相关文章推荐
- GCC单独编译host/examples/ tx_waveforms.cpp
- C++编写Windows服务
- 从C++到GO
- C++关键字-存储说明符
- C++学习之多态篇(虚函数和虚析构函数的实现原理--虚函数表)
- C++ 使用 sscanf_s 读取字符串中的每一行
- C语言 文件操作5--文件的常用函数
- 对字符串数组进行排序,将变位词排在相邻位置
- 2. Aetherspace
- C++STL 常用算法
- C++对象内存模型
- C/C++迭代器使用具体解释
- C++内存布局二
- C++内存布局一
- Boost 学习之算法篇 is_permutation
- 详解c++ 引用(reference)与 指针(pointer)的区别与联系
- C++指针的概念
- ICE中把ICE文件创建成H和CPP
- C++虚函数表解析
- C++索引运算符【】和输出运算符<<重载