当堆栈溢出发生时

时间:2014-05-30 22:10:31

标签: c++ memory stack

当我运行程序时:

int main()
{
    int A[600000];
    return 0;
}

我收到Windows错误"程序已停止工作"跑完后但是:

int main()
{
    int A[500000];
    int B[500000];
    return 0;
}

一切似乎都没问题。是因为堆栈在第一个例子中溢出了吗?我曾经认为每个函数中的变量都放在同一个堆栈中,但我可能错了。是否有可能在函数中创建太多的对象来处理,什么时候太多?

2 个答案:

答案 0 :(得分:3)

你是对的,你溢出了堆栈保留大小(至少在视觉工作室术语中)。堆栈保留大小与单个变量的内存大小有关,您只需在第一个代码段中达到限制。

如果您使用的是Visual Studio,则可以在项目属性中更改堆栈保留大小:

属性 - >配置属性 - >链接器 - >系统 - >堆栈储备规模

答案 1 :(得分:2)

措辞“它出现错误运行让我感到惊讶,因为运行时错误与环境的内存限制有关(例如堆栈溢出或机器的内存最大化)对于两个示例代码都是一样的。

我只能用大小600 000 000重现它,即:

int main()
{
    int A[600000000];
}

在32位平台上是编译器已经停止的无意义:

  

错误:数组'A'的大小太大“

因为它是尝试创建一个大小超过2GB的内存块,无法在32位平台上寻址...而在这种情况下允许使用2个大小为500 000 000的数组:

int main()
{
    int A[500000000];
    int B[500000000];
}

这里合理的做法是简单地避免在堆栈上分配大内存块并将其放在堆上。例如,使用已经提到的std::vector,它本身将驻留在堆栈上,但管理堆上的内部存储:

std::vector<int> v(600000);

在这种情况下,会在堆上分配大小约为2.3MB的内存块。