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

Vin*_*tor 3 c++ memory arrays visual-studio-2010

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

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

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

小智 12

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

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

因此,一个1024x1024的浮点数(假设每个浮点数为4个字节)的时钟频率高达4mb - 你已经在这里通过了默认的堆栈限制.

请注意,即使您拥有Itanium,您也无法使用所有4mb - 参数,例如,也需要存储在堆栈中,请参阅http://www.csee.umbc. EDU /〜昌/ cs313.s02/stack.shtml

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

float stuff[1024 * 1024];
Run Code Online (Sandbox Code Playgroud)

你声明它:

float *stuff = new float[1024 * 1024];
// do something interesting and useful with stuff
delete[] stuff;
Run Code Online (Sandbox Code Playgroud)

现在将在堆上分配,而不是在堆栈上.请注意,这不是同一个堆作为由罗伯特·哈维在他的回答中提到; 你没有这里的/ HEAP选项的限制.

  • 或者只是使用一个向量,它将为你完成所有这些,`vector <vector <float >>`将在堆上分配它的数据并使用RAII自动释放它 (3认同)