声明大数组时堆栈/堆溢出

Stack/heap overflow when declaring a large array

本文关键字:溢出 堆栈 数组 声明      更新时间:2023-10-16

我试图声明一个1024乘1024的浮点数组,但刚刚弹出一个窗口,显示project_name.exe已停止工作。。。带有调试或关闭程序的选项。以前,我成功地声明了1000乘2 int数组。我在互联网上搜索过可能的原因,他们说这是与内存相关的问题,确切地说是"堆栈/堆溢出"。他们说,浮动的情况更糟。

我只需要小数点后5或6位。

有什么建议吗?我在python和matlab中都没有遇到这个问题。我正在使用Microsoft Visual Studio 2010。

是否将其声明为函数或方法中的局部变量?如果是这样,那就是典型的堆栈溢出。有关VS2010,请参阅http://msdn.microsoft.com/en-us/library/8cxs58a6%28v=vs.100%29.aspx

保留值指定虚拟内存中的总堆栈分配。对于x86和x64计算机,默认堆栈大小为1 MB。在安腾芯片组上,默认大小为4 MB。

因此,一个1024x1024的浮点数组(假设每个浮点有4个字节)的时钟频率高达4mb——您已经突破了默认的堆栈限制。

请注意,即使您有安腾,也不能使用所有4mb参数,例如,也需要存储在堆栈中,请参阅http://www.csee.umbc.edu/~chang/cs313.s02/stack.shtml

现在,可以只是增加堆栈大小,但总有一天你需要使用更大的数组,所以这是一场消耗战,你不会赢。这是一个最好通过让它消失来解决的问题;换句话说,而不是:

float stuff[1024 * 1024];

您将其声明为:

float *stuff = new float[1024 * 1024];
// do something interesting and useful with stuff
delete[] stuff;

它现在将被分配到堆上,而不是在堆栈上。请注意,这与Robert Harvey在回答中提到的堆不是同一堆;此处没有/HEAP选项的限制。

您可能在堆栈上声明了这一点吗?这么大的物体必须堆起来!