ошибка stackoverflow в начале программы в функции main - PullRequest
6 голосов
/ 23 марта 2011

Я создал программу, я хочу отладить ее (или запустить), и перед первым оператором в функции main она прерывается с сообщением: необработанное исключение при 0x0020f677 в name.exe: переполнение стека.Почему это происходит и как решить проблему?Visual C ++ 2010, консольное приложение Win32.

EDIT1: отладчик показывает мне код asm на chkstk.asm.

Что важно проанализировать, чтобы решить эту проблему?Что-то, добавленное в заголовочные файлы, вызывает эту проблему?

Ответы [ 4 ]

8 голосов
/ 23 марта 2011

Если вы объявили массив фиксированного размера и его размер слишком велик, у вас может быть эта ошибка.

int fixedarray[1000000000];

Попробуйте уменьшить длину или создать ее в куче.

int * array = new int[1000000000];

Не забудьте удалить его позже.

delete[] array;

Но лучше использовать std :: vector вместо указателей даже в функции C,

//...
int Old_C_Func(int * ptrs, unsigned len_);
//...
std::vector<int> intvec(1000000000);
int * intptr = &intvec[0];
int result = Old_C_Func(intptr,intvec.size());

при условии32-битная компиляция.

3 голосов
/ 23 марта 2011

Звучит так, будто конструктор объекта или некоторый код, вызванный одним из них, вызывает переполнение стека.Я бы использовал отладчик, чтобы увидеть, чем вызвано переполнение стека, имея в виду, что причиной может быть конструктор для глобальной переменной.

0 голосов
/ 28 октября 2016

У меня была похожая проблема, нет отладочной информации, глобальных переменных, массивов большого размера.

У меня был класс с некоторыми структурами, которые были # pragma_pack-ed, и если я создаю этот класс в стеке, тоэта ошибка произошла.Если я выделю его в кучу, работает нормально.(есть идеи почему?)

0 голосов
/ 18 октября 2015

Если ошибка переполнения стека вызвана глубокой рекурсией или большими объектами в стеке, вы также можете устранить ее, увеличив размер стека. Размер по умолчанию для стека в Windows 1 МБ. Вы можете попытаться увеличить его, например, до 10 МБ

Добавить следующую строку в свойство проекта -> Линкер -> Командная строка

/ STACK: 1000000,1000000

Если ошибка вызвана некоторой ошибкой в ​​рекурсии алгоритма, увеличение размера стека не помогает, и вам нужно найти ошибку (вероятно, в рекурсии) или слишком большое выделение стека.

...