ここではいくつかの記事を読んでいますが、コンストラクタから例外をスローすることができます。しかし、コンストラクタから例外がスローされた場合、基本クラスのデストラクタまたはそのデータメンバーを呼び出さないことに気付きました。次の例で考えてみてください。この場合C++でコンストラクタから例外をスローする
#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
を、Eのコンストラクタが例外をスローが、データメンバとして、または基本クラスとしてCのデストラクタが呼び出されていません。現在、Cのデストラクタがファイル/ソケットのクローズやヒープ割り当ての削除などのクリーンアップ操作を実行すると、問題が発生する可能性があります。
私の質問はなぜですか、そしてコンストラクタから例外をスローするのはいつかOKです。
「main」で例外をキャッチすると、デストラクタが呼び出されることに注意してください。 [here](http://ideone.com/nQemT)を参照してください。 –
例外を使用する前に、[this](http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively)とそれに関連する質問をお読みください。 – Shahbaz