質問
使わない時は、はっきりいってるハンドルのようなポインタがないことになるすることが可能ですの参照オブジェクトではなく、オブジェクトそのものです。何より精巧な説明?
解決
ハンドルはカーネル空間内のリソースへのポインタへの整数インデックスから何もすることができます。アイデアは、彼らは、リソースの抽象化を提供ということですので、あなたは、リソース自体にそれを使用することについて多くを知っている必要はありません。
たとえば、Win32 APIの中HWNDはウィンドウのハンドルです。それ自体でそれは無用です:あなたはそれから任意の情報を収集することはできません。しかし、右のAPI関数に渡し、そしてあなたはそれと異なるトリックの富を行うことができます。内部的には、あなたは(必ずしもそれが実現していますどのようになるが、それは魔法は意味を持たせていない場合があります)ウィンドウのGUIのテーブルにだけインデックスとしてHWNDと考えることができます。
EDIT:あなたは、あなたの質問に求めていた、具体的ものではありません100%特定。これは主に、純粋なC / C ++の話をされます。
他のヒント
ハンドルはそれに取り付けられた目に見えるタイプのポインタ又はインデックスです。通常、次のような何かを参照してください。
typedef void* HANDLE;
HANDLE myHandleToSomething = CreateSomething();
あなただけの不透明な値として周りHANDLE渡すあなたのコード中のSOます。
オブジェクトを使用するコードでは、実際の構造型へのポインタをキャストし、それを使用する:
int doSomething(HANDLE s, int a, int b) {
Something* something = reinterpret_cast<Something*>(s);
return something->doit(a, b);
}
それともアレイ/ベクトルへのインデックスとして使用します:
int doSomething(HANDLE s, int a, int b) {
int index = (int)s;
try {
Something& something = vecSomething[index];
return something.doit(a, b);
} catch (boundscheck& e) {
throw SomethingException(INVALID_HANDLE);
}
}
ハンドルののそれは典型的には、いくつかのエンティティを参照する方法であるという点でポインタの一種である。
これは、ポインタはハンドルの一種であるが、すべてのハンドルはポインタではないと言うことは、より正確になります。
は、例えば、ハンドルはまた、それ自体がいくつかのオブジェクトへのポインタを含むエントリに対応するメモリテーブル内にいくつかの指標であってもよい。
重要なのは、実際にそれが識別する事を特定終わるあなたは「ハンドル」を持っているとき、あなたが知っていることも、それがどのように処理するかを気にし、どちらもということです。、あなたが知る必要があるすべては、それがないということです。
また別のものへのハンドルは、同じであってもシステムに、「フードの下」の異なる方法で実施することができるので、「まさに、ハンドルである」への単一の答えがないことは明らかです。しかし、あなたはそれらの違いを気にする必要はありません。
C ++ / CLIでは、ハンドルは、GCヒープ上に位置するオブジェクトへのポインタです。 new
とnew
発現の結果を使用して達成される(アンマネージ)のC ++ヒープ上のオブジェクトを作成する「通常の」ポインタです。管理オブジェクトがGCに割り当てられgcnew
発現とヒープを(管理)。結果は、ハンドルになります。あなたは、ハンドルの上にポインタ演算を行うことはできません。あなたは自由なハンドルをしないでください。 GCは、それらの世話をします。また、GCは、マネージヒープ上のオブジェクトを再配置し、プログラムの実行中に新しい場所を指すようにハンドルを更新して自由である。
これはハンドルボディイディオムするのコンテキストで表示されます、またPIMPLイディオムと呼ばれます。それは "一つは、そのクラスへのデリゲート関数から成る、単に「ハンドル」オブジェクトに保持されているポインタによって参照される別のクラスのオブジェクトに実際のデータを保持することにより、同じライブラリのABI(バイナリインタフェース)を維持することができ体"。
これは、一定の時間と二つのオブジェクトの例外安全なスワップを有効にするためにも便利です。このため、単にボディオブジェクトを指すポインタを入れ替えなければなりません。
ハンドルがどんどんはまだまだです。
ハンドルできる符号なし整数の一部のルックアップ。
ハンドルできるポインタは、大きめのデータです。
でどのようにコードを使用するに扱う動作.を決定する取扱いタイプです。
その理由の取扱い'が使用されているかが重要になります。ることを示して識別またはアクセス型のオブジェクトです。意味を、プログラマーがいながら"キー または アクセスす。
HANDLE hnd;
はvoid * ptr;
同じである
HANDLEは、Visual Studio(Windowsの場合)でWINNT.Hファイルで定義されたtypedefがあります:
typedef void *HANDLE;