首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows 8和MinGW上的MinGW堆栈溢出

Windows 8和MinGW上的MinGW堆栈溢出
EN

Stack Overflow用户
提问于 2014-11-10 16:50:59
回答 3查看 147关注 0票数 0

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

代码语言:javascript
复制
#include <iostream>
using namespace std;

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-10 16:55:07

每个Test对象包含1000个整数,可能以每个大约4kb的速度计时。

主要而言,您正在创建一个由1000个对象组成的数组,总共为4MB。你的堆栈不能容纳4兆。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686774%28v=vs.85%29.aspx说一个常见的缺省值是1MB。

请注意,

代码语言:javascript
复制
std::vector<Test> a(1000);

很可能还能正常工作。std::vector不像本地数组那样将其内容存储在堆栈上。

票数 1
EN

Stack Overflow用户

发布于 2014-11-10 16:54:31

我相信Windows中的默认堆栈大小是1MB。当您分配1000^2个it时(每个it都有4个字节大),您将尝试将更多的信息放在堆栈上,使其无法容纳。

票数 4
EN

Stack Overflow用户

发布于 2014-11-10 16:56:16

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

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

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

代码语言:javascript
复制
gcc -Wl,--stack,N

但是,更好的做法是不要将大型对象存储在堆栈上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26848812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档