MiddleДебаггингРедкоЕщё не отвечали
Можно ли поймать stack overflow в C++ через try/catch?
Этот код оборачивает бесконечную рекурсию в try/catch, рассчитывая корректно обработать переполнение стека. Вместо этого программа падает и не печатает "caught".
void recurse() { recurse(); }
int main() {
try {
recurse();
} catch (...) {
std::cout << "caught\n";
}
}
Найдите ошибку и объясните причину.
Нет. Stack overflow — сигнал ОС (SIGSEGV на Linux, access violation на Windows), не C++ исключение. Рантайм не может раскрутить стек без места. Windows SEH умеет перехватить page fault, но это не переносимый C++.
- ✗Писать
try { recurse(); } catch (...) {}и ждать обработки stack overflow - ✗Выделять большие массивы на стеке в глубоко вложенных вызовах
- ✗Путать stack overflow с
std::bad_alloc— разные механизмы
- →Чем Windows SEH отличается от C++ исключений?
- →Что такое guard page и как ОС детектирует overflow?
Переполнение стека не порождает C++ исключение, поэтому catch его не увидит. Бесконечная рекурсия упирается в guard-страницу — ОС шлёт SIGSEGV (Linux) или access violation (Windows), а не throw:
void recurse() { recurse(); } // съедает стек до guard-страницы
int main() {
try {
recurse();
} catch (...) { // НЕ сработает: это сигнал ОС, не исключение
std::cout << "caught\n";
}
} // программа падает с SIGSEGV / access violation
Рантайму негде раскручивать стек, когда места уже нет. Windows SEH способен перехватить page fault через __try/__except, но это не переносимый C++.