C++/CLI_ハンドルについて

概要

インスタンスgcnew 演算子によって生成すると、
演算子ポインタではなくハンドルを返す。

ハンドルとは共通言語ランタイムによって管理されている
オブジェクトを表し、基本的な考え方はポインタと同じだが
ポインタのようなアドレスの演算は行えない

 

C++ の new はインスタンスの参照 ( ポインタ ) を返す。
C++/CLI の gcnew もインスタンスの参照を返す。
だが、 C++/CLI においてはインスタンスのアドレスを
CLR が管理しているのでハンドルでアドレス演算は行えない。
と、解釈。
↓オブジェクトとインスタンスが入り混じっているが
同じものだと捉えることにした。

 

ハンドル型の変数を宣言するには、変数名の前に ^ 記号を指定。

    T ^ handle = gcnew T;

ネイティブ C/C++ new 演算子は、
生成したオブジェクトのポインタを返す。

 

C++/CLI gcnew 演算子が返すオブジェクトの参照は
CLR によって管理されているインスタンスへのポインタ

ネイティブ C/C++ のポインタのように自由に演算を
行ってよいアドレスとは性質が異なる。
ハンドル型変数に代入可能なのは、参照クラス型オブジェクトへのハンドル。

 

ハンドルは CLR が管理している

C++/CLI では、
CLR が管理しているインスタンス参照する変数
表現する手段としてハンドル型を用意してる。

ハンドル型は、性質的にはポインタと類似してるが、
C++ ポインタ型 *参照型 & よりも安全にオブジェクトを
参照することができる。


ポインタのように変数を数値化してメモリアドレスの演算を
行うということはできない。
しかし、
オブジェクトを参照するための、オブジェクトの場所を
保存しているという意味ではポインタと概念は同じ。

 

アドレス操作ができないわけ

gcnew 演算子は、
CLR が管理しているマネージヒープと呼ばれる領域に配置。

実質的に、gcnew が返すハンドル型の値はマネージヒープに
配置されているオブジェクトへの参照だが
オブジェクトの物理的な配置を管理するのは CLR なので、
実行時にアプリケーションがポインタとしてアドレス操作を
することは望まれない。

よって、
ハンドル型変数はオブジェクトへの参照を保存している
単純な変数にすぎない

ネイティブ C/C++ 言語で使っていたポインタ操作は
ハンドル型で行うことはできない。
ハンドル型変数が保存しているのは常に
有効なオブジェクトへの参照か、または参照していないか。

 

ハンドル型変数が参照しているオブジェクトの操作方法

 

メンバアクセス演算子 -> からオブジェクトのメンバにアクセス可。

    handle->Method();

 

ハンドル型の変数からオブジェクトの実体を参照する方法は
C++ 言語と同様に * 演算子を使って行う。

二つのコードは同義。

    handle->Method();
    (*handle).Method();

 

 

こちらから。
http://www.wisdomsoft.jp/388.html

 

以上。