C++/CLI_delete について

deleteC# の Dispose メソッドと同じ役割を持つ。

正確には、
delete するハンドルが指すオブジェクトが、
IDisposable を実装している場合、
IDisposable の Dispose( ) を確実に呼び出す。

 

C++ の場合

オブジェクトの寿命はスコープなどと常に等しい
範囲外になると直ちにデストラクタが呼び出される。

 

CLI の場合

オブジェクトの寿命がコードで示す期間に一致しない

オブジェクトは CLR のメモリ管理機構の監視下にあるため、
範囲外になってもすぐにオブジェクトは破棄されない。

CLI オブジェクトの後始末は、
CLRガベージコレクションが発生した時であり、
どのタイミングでファイナライザが呼び出されるのかは予測できない

プログラマ自身で定めたタイミングで破棄するには、
リソースの解放を行うメソッドを用意し、
プログラマがそれを呼び出すことで、解放を行うしかない。

IDisposable には Dispose というメソッドがあり、
Dispose を呼びだすことで CLI のオブジェクトの寿命を
C++ と同じように、コードで示す有効期間に等しく保てる。

IDisposable の構文に delete を使うことにしたのは、
C++ の構文に似ており、C++ プログラマにも馴染みがあるから。

 

delete はオブジェクトの占めるメモリ領域も解放するので、
下記の場合、必ず delete する必要がある。 ( C++ )

    NativeClass *object = new NativeClass();
    object->fuga();
    delete object;

 

オブジェクトの占めるメモリ領域は自動的に管理されるので、
必須でないがオブジェクトの寿命に関する考え方を統一化できる。( CLI )

    ManagedClass ^object = gcnew ManagedClass();
    object->piyo();
    delete object;

C++/CLI でも、gcnew で作成したオブジェクトは、
delete で削除することで、Dispose() が呼び出され、
その場でオブジェクトの後始末ができる。

 

 

スコープで書いた場合
C++ では、スタック上に作成したオブジェクトは、
そのスコープを外れるタイミングで、デストラクタが呼び出される。

    {
        NativeClass object();
        object.Xxxx();
    } // object のデストラクタが呼びだされる

 

C++/CLI でも、同じ構文でスタック上に作成できる。

    {
        ManagedClass object(); // 内部で gcnew され
        object.Xxxx();
    } // object の Dispose() が呼びだされる

マネージオブジェクトの場合、
実際にはスタック上のメモリには確保されず、
内部で gcnew されてマネージヒープ上に確保される。
そして、構文上のスコープを外れるタイミングで、
Dispose() が呼び出される。

C# の using 構文に近いが、
C# の using 構文では、その対象となる型は、
IDisposable を実装してなければならない。

C++/CLI のスタック構文や delete では、
どのようなオブジェクトに対しても使うことができ、
IDisposable でないオブジェクトでは単に無視される。

 

 

こちらから。
http://fireball.loafer.jp/kes/article_558.html
http://wa3.i-3-i.info/word13648.html
http://posaune.hatenablog.com/entry/20120107/1325956323

以上。