例外安全にする基本
例外に対し安全なコードを書く基本
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:逆に言えば【何か】が例外を出さないと保障できればよいということでもある