展望互聯網的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