愚蠢程序中的堆栈溢出异常

时间:2012-05-10 21:39:11

标签: c++ visual-studio-2010 visual-c++ stack-overflow

我正在使用VS 2010.
当我在调试模式下运行此程序时,它会抛出堆栈溢出异常,并在第99行的chkstk.asm文件中显示一个断开线。
但是当我在发布模式下运行时,它没问题 此外,如果我将其中一个数组的大小减小到10000,它在Debug中运行良好。是什么原因?

#include <iostream>

using namespace std;
int main()
{
    char w[1000001], temp[1000001];
    cout<<"Why?"<<endl;
    return 0;
}

4 个答案:

答案 0 :(得分:12)

因为堆栈非常小,在大多数系统上大约1MB,所以你的大缓冲区会溢出它。要解决这个问题,只需在堆上分配:

#include <iostream>

using namespace std;
int main()
{
    char* w = new char[1000001];
    char* temp = new char[1000001];
    cout<<"Why?"<<endl;
    delete[] w;
    delete[] temp; 
    return 0;
}

答案 1 :(得分:5)

堆栈非常小(约1MB)。你正在用这些数组中的大量元素填充它。

如果您需要更多空间,请尝试在堆上进行分配(指针指向)。

实现这一点的一个好方法是使用向量,它在内部存储内容:

std::vector<char> w (1000001);
std::vector<char> temp (1000001);

答案 2 :(得分:5)

你在堆栈上分配了太多的东西;可能在调试模式下,堆栈由于各种安全检查而占用更多,或者故意更小以帮助您更早地检测到此类问题。无论如何,使数组变得更大会在发布模式下触发堆栈溢出(除非编译器完全优化它们)。

问题的根源在于你不应该在堆栈上分配大量的东西,它的大小非常有限(默认情况下在Windows上使用VC ++为1 MB),并且只能用于小缓冲区/对象。如果你需要进行大量分配,请在堆上执行(使用new / malloc),最好使用智能指针以避免内存泄漏。

答案 3 :(得分:4)

自动存储中的数组在堆栈上分配。堆栈空间有限。当堆栈上的空间不足以分配自动变量时,会发生堆栈溢出异常。

如果您需要大型数组,请改为使用静态或动态分配。

对于静态分配,请将声明移至main()之外。

对于动态分配,请使用以下代码:

char *w = new char[1000001], *temp = new char[1000001];
// Work with w and temp as usual, then
delete[] w;
delete[] temp;

最后,考虑使用标准容器而不是普通数组:std::array是一个更好的数组,如果你不需要调整大小(它在栈上分配,并不能解决这个问题); std::string也是替换char数组的理想选择。