6

我正在使用 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

4 回答 4

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;
}
于 2012-05-10T21:42:40.140 回答
5

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

如果您需要更多空间,请尝试在堆上分配(指针会这样做)。

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

std::vector<char> w (1000001);
std::vector<char> temp (1000001);
于 2012-05-10T21:41:02.973 回答
5

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

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

于 2012-05-10T21:41:59.907 回答
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数组的好选择。

于 2012-05-10T21:41:37.853 回答