3

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

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

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

4

2 回答 2

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 选项的限制。

于 2013-07-11T18:53:02.963 回答
2

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

于 2013-07-11T18:44:35.197 回答