クラスのコンストラクタ内で例外が投げられ、そのコンストラクタ内でcatchされなかった場合、デストラクタは呼び出されない
► スポイラーを表示
CODE:
#include
#include
#include
using namespace std;
class Error : public runtime_error{
public:
Error( const char* const Mes ) throw() : runtime_error( Mes ){}
};
class A{
public:
A(){ cout << "コンストラクタA" << endl; }
~A(){ cout << "デストラクタ~A" << endl; }
};
class B{
public:
B(){ cout << "コンストラクタB" << endl; throw Error( "例外" ); }
~B(){ cout << "デストラクタ~B" << endl; }
};
int main(){
A* a = nullptr;
B* b = nullptr;
try{
a = new A;
b = new B;
}
catch( const exception& e ){
cout << e.what() << endl;
}
delete a; a = nullptr;
delete b; b = nullptr;
return 0;
}
出力結果
コンストラクタA
コンストラクタB
例外
デストラクタ~A
コンストラクタ内で例外を投げそうな処理を呼び出すときはtry文で囲んでデストラクタで行う処理を呼び出してからまた投げる……
一層程度ならまだいいでしょうがクラスの関係が複雑化すると、クラスにオブジェクトを追加した時にうっかり忘れて……なんてミスが発生しそうですね
► スポイラーを表示
CODE:
class A{
public:
A(){
try{
b=newB;
c=newC;
d=newD;
e=newE;
f=newF;
g=newG;
h=newH;
}
catch(...){
delete h;
delete g;
delete f;
delete e;
//delete d;忘れた!!
delete c;
delete b;
}
}
A~(){
delete h;
delete g;
delete f;
delete e;
delete d;
delete c;
delete b;
}
};
さて、どうするのが一番いい手なのでしょう?
コンストラクタの役割を奪ってInit関数を追加する、ですかね?
みなさんはどう思いますか?