読者です 読者をやめる 読者になる 読者になる

ぷろみん

プログラミング的な内容を扱ってます

operator delete

operator deleteを何とか上手く活用しようと試行錯誤した時のログです。

struct Foo{
    int* a_;
    Foo(){
        a_ = new int;
        // 例外を投げるかもしれない処理
        throw 1;
    }
    // デストラクタでは何もしない
    ~Foo(){}
    void Release(){
        delete a_;
    }

    // 定義していないと例外時にoperator deleteが呼ばれない
    void* operator new(std::size_t size){
        return ::operator new(size);
    }
    void operator delete(void* p){
        if (p){
            Foo* f = static_cast<Foo*>(p);
            f->Release();
            ::operator delete(p);
        }
    }
};

という使い方を考えてみました。 コンストラクタで例外が発生してもリークしません。

でも、operator delete使うよりも

struct Foo{
    int* a_;
    Foo(){
        a_ = new int;
        // 例外を投げるかもしれない処理
        try{
            throw 1;
        }
        catch(...){
            Release();
            throw;
        }
    }
    ~Foo(){ Release(); }

    void Release(){
        delete a_;
    }
};

try/catch使う方が自然な気がするので良い使い方とは言えませんでした。

ちなみに今回の場合だとスマートポインタを使うのが一番スマートです。