Я взглянул на проект стандарта С++ 0x, и насколько я могу судить, в нем нет ничего о переполнении стека. Поиск "переполнения стека" не дает никаких результатов и ищет "стек". Я получил ссылки на разворачивание стека и std:: stack. Означает ли это, что не может быть совместимой реализации стандарта С++, поскольку не существует механизма, позволяющего обрабатывать ошибку, когда память исчерпывается локальным объектом, таким как огромный локальный массив?
Ответ на этот вопрос указывает, что по крайней мере стандарт 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;
}
Я думаю, что стандарт С++ не позволяет какой-либо реализации на С++ делать что-то, что заметно отличается от этих двух программ. В действительности программа A не будет работать на любой современной машине, поскольку она выделяет экзабайт памяти в стеке (представьте, что функция фактически использовала огромный массив, чтобы компилятор не мог безмолвно удалить его, чтобы не повредить). Предоставляет ли стандарт С++ программу A сбой?
Изменить: вопрос заключается не в том, определяет ли стандарт то, что происходит при переполнении стека, вопрос что он говорит, если что-то.