【发布时间】:2009-08-27 16:18:12
【问题描述】:
在互联网上寻找 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()。