Переполнение стека C ++ в Windows 8 и MinGW

0

Я написал следующий код C++. Он скомпилирован в Windows 8 с помощью MinGW (от msys). Если я запустил его, 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 байта.

  • 3
    Скорее всего, размер вашего стека на самом деле недостаточно велик, чтобы вместить 1000 х 1000 х 4 байта. Предоставьте std::vector<Test> a(1000,0); вместо.
  • 0
    Работает гладко, если одна из 1000 является 100.
Теги:
stack-overflow
mingw

3 ответа

1
Лучший ответ

Каждый объект Test содержит 1000 целых чисел, вероятнее всего, с частотой около 4kb.

В основном вы создаете массив из 1000 объектов в общей сложности 4 МБ. Ваш стек не может содержать 4 мегабайта.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686774%28v=vs.85%29.aspx говорит, что общий размер по умолчанию - 1 МБ.

Обратите внимание, что

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

Вероятно, все будет хорошо. std::vector не сохраняет его содержимое в стеке, как это делает локальный массив.

4

Я считаю, что размер стека по умолчанию в Windows составляет 1 МБ. Поскольку вы выделяете 1000 ^ 2 ints, каждый из которых имеет размер 4 байта, вы пытаетесь поместить больше в стек, чем он может удерживать.

  • 0
    Чтобы сделать это более явным: a - 4 МБ, ваш стек - 1 МБ. Попытка поместить 4 МБ содержимого в комнату 1 МБ приводит к переполнению ...
0

Объект Test имеет размер не менее 4000 байт (в зависимости от размера вашей платформы int). Вы пытаетесь создать массив из 1000 объектов Test который будет составлять 4 000 000 байт или почти 4 МБ. Это почти наверняка превышает размер стека по умолчанию для вашей программы. Вы могли бы изменить это с некоторыми параметрами компилятора, но вопрос действительно должен быть тем, что вы пытаетесь сделать?

Вы должны хранить большие объекты в куче вместо стека.

Фактически вы можете изменить размер стека по умолчанию с помощью следующей опции в MinGW в соответствии с этим ответом:

gcc -Wl,--stack,N

Но опять же, лучше всего не хранить большие объекты в стеке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню