展望互联网的C++脑筋急转弯,我发现这个例子:为什么代码崩溃?
#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"; // <- crashes here
}
~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 (const char* ex)
{
cout << ex << endl;
}
return 0;
}
这是我认为该计划会做:
- A :: A()时,输出到屏幕objectA的构造函数被调用。对象A构造成功。
- 当调用objectB的构造函数时,B :: B()将被输出到屏幕。
- B的构造函数然后抛出异常。对象B未被成功构建。
- objectB的析构函数未被调用,因为构造函数从未成功完成。
- 当try块退出时,objectA的析构函数将被调用,因为对象超出了范围。
但是,当我运行该程序时,它实际上在标记为<的行上崩溃。任何人都可以解释那个时候究竟发生了什么?
如果下面的描述(由所有人)是正确的,那么它应该仍然在A的析构函数中发生异常时调用terminate()之前先打印A ::〜A()。 – 2009-08-26 15:29:20