【问题标题】:C++ stack overflow on Windows 8 and MinGWWindows 8 和 MinGW 上的 C++ 堆栈溢出
【发布时间】:2015-01-07 01:15:49
【问题描述】:

我编写了以下 C++ 代码。它使用 MinGW(来自 msys)在 Windows 8 上编译。如果我运行它,Windows 将停止它并给出堆栈溢出错误 (C00000FD)。有什么问题?

#include <iostream>
using namespace std;

class Test{
  public:
    int txt[1000];
};

int main(){
  Test a[1000];
  return 0;
}

如果我想存储一张1920*1080大小的图片,我应该怎么做?它将是 1920*1080*4 字节。

【问题讨论】:

  • 很可能您的堆栈大小实际上不足以容纳 1000 x 1000 x 4 字节。请改为提供std::vector&lt;Test&gt; a(1000,0);
  • 如果 1000 中有一个是 100,则运行顺利。

标签: c++ mingw stack-overflow


【解决方案1】:

我相信 Windows 中的默认堆栈大小是 1MB。当您分配 1000^2 个整数时,每个整数都有 4 个字节大,因此您试图在堆栈上放置的内容超出了它的容量。

【讨论】:

  • 更明确地说:a 是 4MB,你的堆栈是 1MB。试图将 4MB 的东西放入 1MB 的房间会导致溢出......
【解决方案2】:

每个 Test 对象包含 1000 个整数,每个整数可能在 4kb 左右。

在 main 中,您正在创建一个包含 1000 个对象的数组,总共 4MB。你的堆栈不能容纳 4 兆。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686774%28v=vs.85%29.aspx 表示常见的默认值是 1MB。

注意

std::vector<Test> a(1000);

可能会工作得很好。 std::vector 不像本地数组那样将其内容存储在堆栈中。

【讨论】:

    【解决方案3】:

    Test 对象的大小至少为 4000 字节(取决于您平台的 int 大小)。您正在尝试创建一个包含 1000 个 Test 对象的数组,这些对象将是 4,000,000 字节或近 4 MB。这几乎肯定超过了您程序的默认堆栈大小。你可以通过一些编译器选项来改变它,但问题应该是你想要做什么?

    您应该将大对象存储在堆上而不是堆栈上。

    实际上,您可以根据this answer在MinGW中使用以下选项更改默认堆栈大小:

    gcc -Wl,--stack,N
    

    但同样,最好不要将大对象存储在堆栈中。

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 2011-03-02
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 2014-12-28
      相关资源
      最近更新 更多