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

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

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

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

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

最佳答案

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

The reserve value specifies the total stack allocation in virtual memory. For x86 and x64 machines, the default stack size is 1 MB. On the Itanium chipset, the default size is 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;

现在分配在堆上,而不是在堆栈上。请注意,这不是 Robert Harvey 在他的回答中提到的那个堆;您在这里没有/HEAP 选项的限制。

关于c++ - 声明大型数组时堆栈/堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617794/

相关文章:

ios - 使对象随时可用以获得更好的性能

c++ - 用c++设计用户界面

c++ - DirectShow:如何将视频捕获设备的流时间同步到系统时间

c++ - 模板类可以有纯虚函数和虚运算符吗?

c++ - 继承和重载默认构造函数

c++ - 通过组策略安装 VC++ 可再发行组件的最佳方法是什么?

c# - 使用来自 C++ dll 的 __declspec(dllexport) 签名声明在 C# 中调用

android - phonegap开发环境

c - 为什么会泄漏内存?

c - 当虚拟内存使用量达到256GB时进程输入界面停止响应