当在另一个异常的堆栈展开过程中抛出异常时会发生什么?

5
例如在以下代码中:
#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 的析构函数,导致另一个异常被抛出,那么程序会如何反应?

请勿在析构函数中抛出异常。如果析构函数引发异常,则程序处于非定义状态,这将导致无法预测的行为。因此,您应该确保析构函数不会抛出异常,以避免这种情况的发生。 - Pontus Gagge
1个回答

9

简短回答?应用程序被终止。

来自parashift

在堆栈展开期间,所有这些堆栈帧中的本地对象都被销毁。如果其中一个析构函数抛出异常(比如抛出了一个Bar对象),C++运行时系统就处于无法胜利的境地:它应该忽略Bar并最终到达

} catch (Foo e) { 

它最初的目标是什么?它应该忽略Foo并寻找一个什么?
} catch (Bar e) { 

handler?没有好的答案——任何一种选择都会丢失信息。

所以C++语言保证在此时调用terminate(),而terminate()会杀死进程。砰,你死了。

相关问题:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接