例外安全にする基本

例外に対し安全なコードを書く基本

ClassA * p_ClassA = new ClassA();
【何か】
delete p_ClassA;

としてはいけない。


【何か】で例外が起きたらそれだけでメモリーリークする*1
以上の場合はauto_ptrを使うことで解決できる。

std::auto_ptr<ClassA> ap_ClassA(new ClassA());
【何か】
//delete p_ClassA;

ただし、上記は単体のオブジェクトにしか使えない。たとえば以下のような配列をnewで確保するとき、

std::auto_ptr<ClassA> ap_ClassA(new ClassA[30]);
func(p_ClassA.get(), 30);//配列のポインタをとる関数
//delete[] p_ClassA;

のようにauto_ptrは使ってはいけない。これは以下のように

std::vector<ClassA> tmp_ClassAList(30);
func(&(tmp_ClassAList[0]), 30);//配列のポインタをとる関数
//delete[] p_ClassA;

vectorをつかってやることで解決できる。

*1:逆に言えば【何か】が例外を出さないと保障できればよいということでもある