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

Tem*_*mak 6 c++ stack-overflow visual-studio-2010 visual-c++

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

#include <iostream>

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

Ton*_*ion 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 或像其他人已建议的那样使用`std :: vector`! (2认同)

chr*_*ris 5

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

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

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

std::vector<char> w (1000001);
std::vector<char> temp (1000001);
Run Code Online (Sandbox Code Playgroud)


Mat*_*lia 5

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

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