続・「C++のコンストラクタで例外を投げてはいけない」は迷信

d:id:nyaxt:20080322の続き

id:ototoiさんにいろいろ教えてもらったのでメモ。

配列を動的確保していた場合はどうするか?

boost::scoped_arrayを使う。

コンストラクタ/デストラクタからはメンバ関数も呼べる

呼び出し先のメンバ関数でのリソースリークにも注意!

スマートポインタを使わない場合のメモ

コンストラクタのcatch節とデストラクタの内容がかぶるので、そこを関数化しておくと便利。

こんな感じ:

class Hoge
{
public:
    Hoge()
    {
        try {
            initialize();
        }
        catch(...) {
             destroy();

             throw;
        }
    }
    
    ~Hoge()
    {
        destroy();
    }

    void initialize();
    void destroy();
};

追記:
throw;が抜けていたので修正しました。

また、function try blockを使う事で、以下のように書くことも出来ます。

    Hoge()
    try {
        initialize();
    }
    catch(...) {
         destroy();

         /* throw; */ // これは自動で再throwされる
    }