Что происходит, когда возникает исключение при разматывании стека из другого исключения? - PullRequest
4 голосов
/ 23 июля 2010

Например, в следующем коде: деструктор

#include <iostream>
using namespace std;
class A {
     public:
           A() { cout << "A::A()" << endl; }
           ~A() { cout << "A::~A()" << endl; throw "A::exception"; }
     };
class B {
     public:
           B() { cout << "B::B()" << endl; throw "B::exception"; }
           ~B() { cout << "B::~B()"; }
     };
int main(int, char**)
{
     try {
           cout << "Entering try...catch block" << endl;
           A objectA;
           B objectB;
           cout << "Exiting try...catch block" << endl;
     }
     catch (char* ex) {
           cout << ex << endl;
     }
     return 0;
}

B генерирует исключение, которое вызывает деструктор A при разматывании стека, что приводит к выбросу другого исключенияКакова будет реакция программы?

1 Ответ

6 голосов
/ 23 июля 2010

Краткий ответ?Взрыв, завершение приложения.

С parashift :

Во время разматывания стека все локальные объекты во всех этих кадрах стека разрушаются.Если один из этих деструкторов выдает исключение (скажем, выбрасывает объект Bar), система времени исполнения C ++ находится в безвыходной ситуации: если она игнорирует Bar и в конечном итоге окажется в

} catch (Foo e) { 

, где онаизначально был во главе?Должен ли он игнорировать Foo и искать обработчик

} catch (Bar e) { 

?Нет хорошего ответа - любой из вариантов теряет информацию.

Таким образом, язык C ++ гарантирует, что на этом этапе он вызовет terminate(), а terminate() убивает процесс.Удар, ты мертв.

Вопросы, связанные с переполнением стека:

...