Я взглянул на черновик стандарта C ++ 0x, и, насколько я могу судить, там нет ничего о переполнении стека. Поиск «переполнения стека» не дал результатов, а поиск «стека» я получил только ссылки на раскручивание стека и std :: stack. Означает ли это, что не может быть соответствующей реализации стандарта C ++, поскольку не существует механизма обработки ошибки, когда память исчерпывается локальным объектом, таким как огромный локальный массив?
Ответы на этот вопрос показывают, что по крайней мере Стандарт C не упоминает о переполнении стека.
Чтобы конкретизировать вопрос, рассмотрим эту программу
// Program A
int identity(int a) {
if (a == 0)
return 0;
char hugeArray[1024 * 1024 * 1024]; // 1 GB
return identity(a - 1) + 1;
}
int main() {
return f(1024 * 1024 * 1024);
}
и эта программа
// program B
int main() {
return 1024 * 1024 * 1024;
}
Я думаю, что стандарт C ++ не позволяет какой-либо реализации C ++ делать что-то заметно отличающееся в этих двух программах. На самом деле программа A не будет работать ни на одной современной машине, поскольку она выделяет эксабайт памяти в стеке (представьте, что функция фактически использовала огромный массив, поэтому компилятор не может удалить его молча, чтобы не повредить). Допускает ли стандарт C ++ ошибку программы A?
Изменить: вопрос не в том, должен ли стандартный определять, что происходит при переполнении стека, вопрос в том, что он говорит, во всяком случае.
new char[HUGE]
потерпит неудачу. Но что, если ваш исходный код содержит миллиарды миллиардов функций? Все полностью валидный стандартный C ++ ... - person Kerrek SB   schedule 06.07.2011alloca()
циклы вызовов проверяют множество страниц? И даже если вы готовы заплатить эту цену (поскольку педантично это означает, что вы можете, даже если это невозможно дорого), у вас все равно нет абсолютной уверенности относительно страницы, расположенной непосредственно над кучей. - person geekosaur   schedule 06.07.2011