C++/CLI_デストラクタ と ファイナライザ ( 追記 )

アンマネージドなリソースを使っている場合のソースの追記。

デストラクタファイナライザ

 デストラクタ

これは使わないから捨てるね!

人の目から見て
インスタンスが破棄されたときに実行される関数。
delete と書くと実行されるので人は把握できる。

gcnew で生成した場合は、delete 呼び出し時
gcnew を使用せず作成した場合は、スコープを抜けた時

 

ファイナライザ

使っていないようだから回収するね!

ガベージコレクタの目から見て
インスタンスが破棄されたタイミングで実行されるメソッドこと。

呼び出されるタイミングは、
ガベージコレクションによる解放時。

つまり、
ガベージコレクタがメモリ上の不要なインスタンスを回収した
タイミングで実行される関数。
ファイナライザが実行されるかガベージコレクタ次第。
いつ実行されるか人には不明

 

C#Dispose に該当するのを、C++/CLI ではデストラクタと呼び、
C#デストラクタ に該当するのを、C++/CLI ではファイナライザと呼ぶ。

 

アンマネージドなリソースを使っている場合

解放すべき場所はデストラクタではなくファイナライザ

 

    Class1()
    {
        nativeClass = new CNativeClass();
    }
    ~Class1()
    {
        //マネージリソースは特に無いので無視
        //ファイナライザ呼び出し
        this->!Class1();
    }
    !Class1()
    {
        //アンマネージリソースの片付け
        if(nativeClass != 0)
        {
            delete nativeClass;
            nativeClass = 0;
        }
    }
    
    CNativeClass * nativeClass;
   

分からん。
C++/CLI の Class1 がガベージコレクションで片付けられる時、
Class1 で使用したアンマネージクラスも破棄する必要があるので、
ファイナライザ実行時に delete nativeClass のコードでアンマネージクラスを片付けている ?
だが、ファイナライザでは他のマネージドリソースをデストラクトするべきではない、ともあるし。

 

 

こちらから。
http://w4ard.s26.xrea.com/weblog/2009/11/09T145145.html
https://www37.atwiki.jp/visualstudio/pages/41.html
http://posaune.hatenablog.com/entry/20120107/1325956323

以上。