2012-02-28 3 views
0

В Windows XP с использованием Visual C++ с 2 ГБ ОЗУ, сколько функций должно быть в стеке одновременно, чтобы создать stackoverflow? (т. е. в рекурсивных функциях)Сколько функций для создания stackoverflow?

Есть ли простой способ рассчитать это для других подобных ситуаций?

+0

Стек мегабайта по умолчанию. Минимально возможный стек стека составляет 4 байта в оптимизированной сборке. Практические гораздо больше. ОЗУ не имеет к этому никакого отношения. –

+1

Я могу переполнить стек только одним вызовом функции. – mah

ответ

3

Невозможно узнать только из компилятора. Переполнение стека происходит из-за переполнения стека. Размер стека растет в зависимости от аргументов, которые принимает функция, локальных переменных, которые использует функция, и оптимизации компилятора. Есть даже некоторые функции C99, которые, я считаю, будут выделять пространство непосредственно из стека.

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

Это не то, что вы можете определить априори. По крайней мере, не тривиально.

+1

На самом деле, можно определить предел стека изображения во время выполнения, посмотрев его поле SizeOfStackCommit в дополнительном заголовке PE (смещение 72). Как сказал Ханс, обычно 0x10000 (1MB). –

0

Вы можете попробовать бесконечную рекурсию. Это одна из распространенных причин переполнения стека.

int f() { g(); } int g() { f(); }

+0

Это не отвечает на вопрос. - Кроме того, я ожидал, что это приведет к переполнению стека менее чем за 5 секунд, но вместо этого он был отключен: http://ideone.com/QoWtS;) – visitor

Смежные вопросы