ユーザ用ツール

サイト用ツール


cli:interior_ptr

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

cli:interior_ptr [2009/02/02 17:12]
192.168.0.72
cli:interior_ptr [2013/12/23 09:08]
ライン 1: ライン 1:
-====== 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>​ 
-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 (外部編集)