ハンドル、gcnew

C++/CLIでガーベッジコレクション(GC)の機能が加わりましたが、この機能が働くのはマネージヒープに対してのみです。マネージヒープに対しては、いままでのポインタや参照の概念は使わずに、新しくハンドルという概念を使います。

マネージヒープはGCにより、プログラマが意図しないところで、いらなくなったメモリの開放やメモリの並び替えが行われます。このためアドレス値をじかにもつポインタや参照のようなものでは駄目なのです。

マネージヒープ上に作成するクラスは新しいキーワード“ref class”を使って定義しなければなりません。 また、いままでのclassで定義されたクラスははマネージヒープ上に作成することはできません。

マネージヒープ上にインスタンスを作成するには、キーワード“gcnew”を使います。これらののインスタンスは、GCによりメモリから開放される際に、ファイナライザーが呼ばれます。

マネージヒープ上に作成されたインスタンスのメモリ開放はもはやGCの仕事ですが、“delete”を呼び出すことはできます。これはデストラクタをコールします。デストラクタが呼ばれると、ファイナライザーは呼ばれなくなります。また、“delete”を呼ばずにおくと、デストラクタは呼び出されず、ファイナライザしか呼ばれません。

ファイナライザの構文はクラスCに対して、!C()です。 ファイナライザーはいつ、どのスレッドによって呼び出されるかわかりません。