例如,在以下代码中:
#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的析构函数,导致抛出另一个异常。程序会有什么反应?
发布于 2010-07-23 22:09:25
简短的回答?突然,应用程序终止。
来自parashift
在堆栈展开期间,所有这些堆栈帧中的所有局部对象都会被析构。如果其中一个析构函数抛出异常(假设它抛出了一个Bar对象),那么C++运行时系统将处于一种失败的境地:它是否应该忽略该Bar并以
} catch (Foo e) { 它最初的目的地是哪里?它是否应该忽略Foo并查找
} catch (Bar e) { 操控者?没有好的答案--任何一个选择都会丢失信息。
因此,C++语言保证它将在此时调用terminate(),而terminate()将终止该进程。你死定了。
关于堆栈溢出的相关问题:
https://stackoverflow.com/questions/3318887
复制相似问题