【问题标题】:Stack/heap overflow when declaring a large array声明大数组时的堆栈/堆溢出
【发布时间】:2013-07-11 03:59:17
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您无法在实际代码前解决问题,而您的整个工作环境都由您支配,我们还有什么希望在没有工具和可见性的情况下解决它?它与内存相关的问题;您将不得不进行一些调试并找出原因。
  • 如果您的二维数组不需要连续,请尝试分配 1024 个单独的 1024 大小的浮点数组。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您是否将其声明为函数或方法中的局部变量?如果是这样,那就是经典的堆栈溢出。 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 选项的限制。

    【讨论】:

    • 或者只使用向量,它会为您完成所有这些工作,vector<vector<float>> 会在堆上分配它的数据并使用 RAII 自动释放它
    • 但是,请注意这同样适用于 C 程序(除了使用 malloc/free 而不是 new/delete),因此不使用向量更普遍有用。
    猜你喜欢
    • 2022-01-02
    相关资源
    最近更新 更多