Я написал следующий код 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 байта.
Каждый объект 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
не сохраняет его содержимое в стеке, как это делает локальный массив.
Я считаю, что размер стека по умолчанию в Windows составляет 1 МБ. Поскольку вы выделяете 1000 ^ 2 ints, каждый из которых имеет размер 4 байта, вы пытаетесь поместить больше в стек, чем он может удерживать.
a
- 4 МБ, ваш стек - 1 МБ. Попытка поместить 4 МБ содержимого в комнату 1 МБ приводит к переполнению ...
Объект Test
имеет размер не менее 4000 байт (в зависимости от размера вашей платформы int). Вы пытаетесь создать массив из 1000 объектов Test
который будет составлять 4 000 000 байт или почти 4 МБ. Это почти наверняка превышает размер стека по умолчанию для вашей программы. Вы могли бы изменить это с некоторыми параметрами компилятора, но вопрос действительно должен быть тем, что вы пытаетесь сделать?
Вы должны хранить большие объекты в куче вместо стека.
Фактически вы можете изменить размер стека по умолчанию с помощью следующей опции в MinGW в соответствии с этим ответом:
gcc -Wl,--stack,N
Но опять же, лучше всего не хранить большие объекты в стеке.
std::vector<Test> a(1000,0);
вместо.