こんばんわ!!くろのすけです。
Visual C++ 2005 Express Editionを使って、C++/CLIプログラミングを
勉強しています。
くろのすけは、まだ始めたばかりです。(3日程度です)
「Microsoft Visual C++ 2005アプリケーション開発入門」(日経BPソフトプレス)を見て慣れようとしているんですが、
"ハンドル"というワードが出てきました。
Object^ → オブジェクト型のハンドル
String^ → 文字列型のハンドル
と説明があり、メモリのアドレスを直接示すC言語のポインタと
違い、メモリの識別子を保持すると書いてありました。
どうも意味がよくわかりません。
ポインタなら、アドレスが代入されると思ってます。
(文字列なら先頭のアドレスとか)
String^ s の場合、sには、文字列がそのまますべて代入されている
ような。
デバッグしながらsの中身を見ても、アドレスは代入されていません。
Googleで検索したのですが、どうもピンとくる説明がないので、
ここならご存知の方がいると思い、質問させていただきました。
お分かりの方、どうぞよろしくお願いします。
.NET Frameworkの概念にガベージコレクションというのがあります。
そのガベージコレクションによって実態が移動した場合も同じ参照先をさせるようにしたものがハンドルです。
ポインタと違って、ヒープ領域のある固定の場所に領域をとるわけではないので、アドレスを保持するというのとはちょっと違います。
詳しくは、C++/CLIの入門書できちんと学ばれたほうが良いかと思います。
お勧めは、中さんの「実践C++/CLI 極めるための基礎と応用テクニック」
Blue様、ご回答感謝します。
ポインタのポインタだ!と説明しているところもありました。
(ダブルポインタかと思って混乱します.....)
『「メモリブロックのアドレスの書いてあるメモリ」を「マスターポインタ」と呼び、マスターポインタを指すポインタ変数を「ハンドル」と呼びます。』という説明も見つけたのですが....難しいです。
ブレークポイントを設定して、デバッグの途中でハンドル(上の例では's')
の値を見ると、文字列が設定されているようなので、
実際は、(アドレスじゃなく)値を入れる変数なのかとも
思いました。
いずれにしろ、Blue様おすすめの「実践C++/CLI 極めるための基礎と応用テクニック」を読んでみますね!
> 『「メモリブロックのアドレスの書いてあるメモリ」を
> 「マスターポインタ」と呼び、マスターポインタを指すポインタ変数を
> 「ハンドル」と呼びます。』という説明も見つけたのですが....
どこかに全てのポインタ(アドレス)を管理する配列があり、
その配列のインデクスが入っていると考えるとイメージできませんか?
ちなみに中氏の「実践C++/CLI 極めるための基礎と応用テクニック」臨時正誤表はこちら
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=4726
自分もそれほど詳しくないんですが、IDみたいなもんだと思います。
オブジェクトリスト(配列)の各要素に重複しないID値(ハンドル)を振り分けておいて、後は必要に応じてそのIDを利用してオブジェクトリスト内の要素を特定(取り出す)する感じです。
IDが無効だったら取得に失敗。(これがポインタなら不正アクセスでプログラムとまっちゃいますからね)
ID値の一部に配列のインデックス値が含まれているので、アクセスも高速。
という感じでしょうか?
違ったら指摘お願いします。
"ハンドル Windows"で検索してみたら結構いい感じかも。
WinAPIのハンドルは、オブジェクトの内部を知らなくてもオブジェクトを操作できるための仕組みです。(ウィンドウハンドルはウィンドウオブジェクトを操作する)
オブジェクトに直接アクセスできないのは、Windowsのバージョンが変わると構造が変わる可能性があるからだと思います。(受け売りですが^^;
まあ、簡単にいうと自動車のハンドルです。(おそらく語源も
自動車の内部や仕組みをしらなくてもハンドルで操作することができますよね?
もちろん機種が変わってもハンドルの握り方は同じです。
ごめんなさい"ハンドル Windows"微妙でした。
検索結果眺めてたらよさげな感じだったんですが、実際は)゜0゜(
ポインタもハンドルも本質は一緒で,何らかのオブジェクトを指し示しており,指し示されたオブジェクト操作するためのものです。
# ポインタに付いている,配列反復子としての機能を除く。
もともとポインタがメモリアドレスだというのは実装詳細でしかないのです。
実装詳細という点で言えば,(.NET Framework 1.0の資料になりますが).NET Frameworkにおける参照とはポインタそのものです。
# で,ハンドルとは(.NET Frameworkにおける)参照そのもののはず。
> ポインタのポインタだ!と説明しているところもありました。
> (ダブルポインタかと思って混乱します.....)
> 『「メモリブロックのアドレスの書いてあるメモリ」を「マスターポインタ」と呼び、
> マスターポインタを指すポインタ変数を「ハンドル」と呼びます。』という説明も
> 見つけたのですが....難しいです。
これ、もしかして旧Mac OS (Mac OS 9以前)の「ハンドル」の説明を読まれたのではないですか?
旧Mac OSでは、物理メモリ断片化を解消するためにダブルポインタを利用し (詳細は略)、
その1段目のポインタのことを「ハンドル」と呼んでいましたが、ここでのハンドルとは
別物です。
ここで問題になっているハンドルは、他の方がいろいろと説明されていますが、
結局のところ、「それを介してオブジェクトにアクセスできるポインタのような何か」
程度の理解で十分でしょう。
実装はただのポインタかもしれませんし、ダブルポインタかもしれませんし、または
何らかのテーブルのインデックスかもしれませんが、そのあたりは気にしない方向で、
というか、気にしてはいけません。
そもそも、ハンドルは、オブジェクトの内部構造や、オブジェクトへのアクセス方法を
意識させないことを目的としていますから、素直に煙に巻かれておくのがよいかと
(なんだかヤな表現ですが)。
私はハンドルの意味もしらずにハンドルを使ってきました
どうも単なる整理番号じゃないかなという感触をいだいています
ハンドルの意味よりは
〜〜のハンドルはどのようにGETするかということのほうが重要な気がします
くろのすけです。
皆様回答ありがとうございます。
返答が遅れてすみません。
>Blue様
「実践C++/CLI 極めるための基礎と応用テクニック」を読みました。
なんとなくですが、理解できたようなきがします。
>yoh2様
>> ポインタのポインタだ!と説明しているところもありました。
>> (ダブルポインタかと思って混乱します.....)
>> 『「メモリブロックのアドレスの書いてあるメモリ」を「マスターポインタ」と呼び、
>> マスターポインタを指すポインタ変数を「ハンドル」と呼びます。』という説明も
>> 見つけたのですが....難しいです。
>これ、もしかして旧Mac OS (Mac OS 9以前)の「ハンドル」の説明を読まれたのではないですか?
はいそうです。
>旧Mac OSでは、物理メモリ断片化を解消するためにダブルポインタを利用し (詳細は略)、
>その1段目のポインタのことを「ハンドル」と呼んでいましたが、ここでのハンドルとは
別物です。
はい。
yoh2様のおっしゃるような理解でいこうかと思います。
皆様ありがとうございました。
P.S.
私事ですが、私はC++というものを一度学ぼうと、上記の「Microsoft Visual C++ 2005アプリケーション開発入門」で勉強していますが、
いきなりC++/CLI対応のプログラミングだったので、
最近は、「C++美しいプログラミング見本帖」も読んでいます。
c++/cliに未来は?
http://blogs.wankuma.com/episteme/archive/2006/09/12/38394.aspx
ツイート | ![]() |