内容へ移動
C++プログラマのためのC++/CLI入門
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
現在位置:
TOP
»
cli
»
interior_ptr
cli:interior_ptr
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
{{indexmenu_n>10}} ====== interior_ptr ====== interior_ptrはマネージヒープ上にあるvalue typeや基本型を指すためのポインタです。 以下のコードを考えます。 <code cpp> ref class R { public: Object o; int i; }; void set100(int* i) { *i = 100; } int main() { R^ r = gcnew R; set100(&r->i); } </code> このコードはset100()でエラーになります。マネージヒープ上にあるものはポインタで受け取ることはできません。マネージヒープ上のデータはいつ場所が変わるかわからないため、純粋なアドレスを保持するポインタではまずいのです。 そこで以下のようにして見ます。 <code cpp> ref class R { public: Object o; int i; }; void set100(int^ i) { i = 100; } int main() { R^ r = gcnew R; set100(r->i); } </code> こうするとset100()のところではr->iはボックス化されてしまい、100がセットされるのは、新しく作られたintインスタンスに対してです。このインスタンスはいずれ捨てられてしまいます。 そこでinterior_ptrを用いて以下のように書きます。 <code cpp> ref class R { public: Object o; int i; }; void set100(interior_ptr<int> i) { *i = 100; } int main() { R^ r = gcnew R; set100(&r->i); } </code> これでr->iを変更することができます。また普通のint*をset100()に渡すこともできます。 また、トラッキング参照を用いて以下のように書くこともできます。 <code cpp> ref class R { public: Object o; int i; }; void set100(int% i) { i = 100; } int main() { R^ r = gcnew R; set100(r->i); } </code> トラッキング参照も、普通のintを受け取ることができます。
/var/www/html/virtual/cppcli/data/pages/cli/interior_ptr.txt
· 最終更新: 2013/12/23 09:08 (外部編集)
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ