例如在下面的代码中:
#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
的析构函数,同时展开堆栈,导致抛出另一个异常。
程序会有什么反应?
简短的回答?砰,应用程序终止。
From 准位移 http://www.parashift.com/c++-faq-lite/exceptions.html:
在堆栈展开期间,所有这些堆栈帧中的所有本地对象都将被破坏。如果这些析构函数之一抛出异常(假设它抛出 Bar 对象),则 C++ 运行时系统将处于双输的境地:它是否应该忽略 Bar 并最终进入
} catch (Foo e) {
它最初的目的地是哪里?它是否应该忽略 Foo 并寻找
} catch (Bar e) {
处理程序?没有好的答案——任何一种选择都会丢失信息。
所以C++语言保证它会调用terminate()
此时,并且terminate()
杀死该进程。砰,你死定了。
Stack Overflow 上的相关问题:
- 为什么在 C++ 中第二次调用析构函数会出现未定义行为? https://stackoverflow.com/questions/2771567/why-exactly-is-calling-the-destructor-for-the-second-time-undefined-behavior-in-c
- 抛出异常
析构函数 https://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)