繁体   English   中英

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

[英]Stack/heap overflow when declaring a large array

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

我只需要最多5或6个小数位。

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

您是在函数或方法中将其声明为局部变量吗? 如果是这样,这是经典的堆栈溢出。 对于VS2010,请参见http://msdn.microsoft.com/zh-cn/library/8cxs58a6%28v=vs.100%29.aspx

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

因此,一个1024x1024的float数组(假设每个float包含4个字节)以高达4mb的速度进入-您已经在这里通过了默认的堆栈限制。

请注意,即使您确实拥有Itanium,也将无法使用所有这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;

现在,它不再位于堆栈中,而是分配到堆中。 请注意,这是一样的堆作为由罗伯特·哈维在他的回答中提到; 您在这里没有/ HEAP选项的限制。

您是在堆栈上声明吗? 这么大的对象必须在堆上!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM