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

时间:2013-07-11 18:28:31

标签: c++ visual-studio-2010 memory arrays

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

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

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

2 个答案:

答案 0 :(得分: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/~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选项的限制。

答案 1 :(得分:2)

你是否在堆栈中声明这个?必须在堆上的大对象!