10項 コンストラクターでの資源の漏れを防ぐ

コンストラクターでの資源の漏れを防ぐ



コンストラクタ内で例外が発生したオブジェクトのデストラクタは、呼び出されません。

class BookEntry
{
public:
    BookEntry(const string &name, const string &address)
        : _name(new Name(name)), _address(new Address(address)){}
    ~BookEntry()
    {
        delete _name;
        delete _address;
    }
    ...
private:
    Name *_name;
    Address *_address;
}

上の例のコンストラクタ内で例外が発生した場合、デストラクタが呼び出されなくなります。
"_address(new Address(address))"で例外が発生すると、_nameは解放されず、メモリリークを起こします。



解決策は、_nameと_addressをauto_ptrにすることです。

class BookEntry
{
public:
    BookEntry(const string &name, const string &address)
        : _name(new Name(name)), _address(new Address(address)){}
    ~BookEntry(){}
    ...
private:
    auto_ptr<Name> *_name;
    auto_ptr<Address> *_address;
}

auto_ptrを使えば、"_address(new Address(address))"で例外が発生しても、_nameのデストラクタは呼び出されます。
また、わざわざデストラクタに解放処理を書く必要がなくなります。