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のデストラクタが呼び出されます。