09項 資源の漏れを防ぐためにデストラクターを使う
資源の漏れを防ぐためにデストラクターを使う
デストラクタに資源の解放処理を記述してあっても、例外の発生によりデストラクタが呼び出されない事があります。
本書の例を引用します。
void processAdoptions(istream &dataSource) { while(dataSource) { ALA *pa = readALA(dataSource); //データがある間、読み込み pa->processAdoption(); //処理をする。例外が発生する可能性あり delete pa; //ポインタを削除 } }
この例の"pa->processAdoption();"で例外が発生した時、"delete pa;"は実行されません。ALAのデストラクタも呼び出されません。
解決策は、auto_ptrを使うことです。
void processAdoptions(istream &dataSource) { while(dataSource) { auto_ptr<ALA> pa(readALA(dataSource)); pa->processAdoption(); } }
もし"pa->processAdoption();"で例外が発生しても、その例外がcatchされ、オブジェクトがスコープを外れるとauto_ptrのデストラクタが呼び出され、続いてALAのデストラクタが呼び出されます。