C++/CLI の基礎 ( デストラクタとファイナライザ )

C++/CLI のオブジェクトは、
ガーベージコレクション時に呼ばれるファイナライザにて解放処理を行う。
呼び出されるタイミングはガーベージコレクションが判断

不必要となった時点で明示的に解放すべき場合は、
delete 呼び出し時に呼ばれるデストラクタにて解放処理を行う。
デストラクタが呼ばれるとファイナライザ呼ばれなくなる

 

C# では、
オブジェクトを明示的に開放する場合、
呼び出し側で using ステートメントを記述し、
呼び出されるクラスは IDisposable インターフェイス
実装する必要があった。
C++/CLI のデストラクタではその手間が省かれている。

 

    // コンストラクタ
    MyClass()
    {
    }
    // デストラクタ
    ~MyClass()
    {
    }
    // ファイナライザ
    !MyClass()
    {
    }
   
    int main()
    {
        MyClass myclass;
        MyClass^ pmyClass = gcnew MyClass();
 
    // deleteを呼ぶとデストラクタが呼ばれ、
    //  deleteを呼ばないとガーベージコレクションの判断したタイミングで
    //  ファイナライザが呼ばれる
   
    delete myClass;    //デストラクタが呼ばれる
    //デストラクタ はマネージドアンマネージド両方とも解放

    }  // myClass のデストラクタが呼ばれる

 

 

デストラクタ

呼び出されるタイミングは、
gcnew で生成した場合は、delete 呼び出し時
gcnew を使用せず作成した場合は、スコープを抜けた時
C# では Dispose( ) に相当。

リソース ( 特にアンマネージドリソース ) を積極的に解放する為のメソッド。
リソースが要らなくなったらすぐ呼ばれるべきもので、
スコープを抜ける時に自動的に呼ばれたり、プログラマが明示的に呼んだりする。

 

ファイナライザ

呼び出されるタイミングは、
ガーベージコレクションによる解放時
C# では デストラクタに相当。

リソースの解放し忘れによる被害を最小限に抑える為にあるメソッド。
ガベージコレクタが使う最後の砦。

 

 

アンマネージドリソース

 ガベージコレクタの管轄外にあるリソース。
例えば Cmalloc標準C++ の new などによって、
ガベージコレクタが監視できないヒープに確保されたオブジェクトなど。
ガベージコレクタはこれらを自動的に解放する事はできない

 

マネージドリソース

ガベージコレクタによって管理されるリソース。
ガベージコレクタの管轄であるマネージドヒープに作られたオブジェクトの事。
C++/CLI の ref classオブジェクトとか C# の classオブジェクトなど。

 

 

 

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

 

以上。