2010年8月5日木曜日

C++/CLI Dispose

C++/CLIでもDisposeパターン。
C++/CLIではデストラクタが呼ばれるとインスタンスが破棄される。(デストラクタを呼び出すのは deleteまたはnewしていないインスタンス。)
破棄されたインスタンスはGCの対象外になるためファイナライザも呼ばれることはない。

以下のようにデストラクタとファイナライザを定義してやればよい。

----間違っていたサンプルコード

public ref class DisposableImplClass
{
public:
    DisposableImplClass()
    {
        disposed = false;
    }

    virtual ~DisposableImplClass()
    {
        Dispose(true);
    }

    !DisposableImplClass()
    {
        Dispose(false);
    }

private:
    bool disposed;
    void Dispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }
}

----



コメントで指摘されている通り、サンプルプログラムが間違っていました。。。
指摘してくれた人には感謝です!


----修正したサンプルコード

public ref class DisposableImplClass
{
public:
    DisposableImplClass()
    {
        disposed = false;
    }

    virtual ~DisposableImplClass()
    {
        DoDispose(true);
    }

    !DisposableImplClass()
    {
        DoDispose(false);
    }

private:
    bool disposed;
    void DoDispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }
}


----
.

2 件のコメント:

匿名 さんのコメント...

エラー 3 error C2605: 'Dispose' : このメソッドは、マネージ クラスで予約されています

匿名 さんのコメント...

IDisposableを継承させないとエラーになってしまいます。
つまりこのコードは間違いです。

ラベル