ユーザ用ツール

サイト用ツール


cli:interior_ptr

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
cli:interior_ptr [2009/01/31 11:49]
admin
cli:interior_ptr [2013/12/23 09:08] (現在)
ライン 1: ライン 1:
-{{indexmenu>..#1|js navbar nocookie}}+{{indexmenu_n>10}}
 ====== interior_ptr ====== ====== interior_ptr ======
  
  
-interior_ptrはマネージヒープ上にあるvalue type基本型を指すためのポインタです。+interior_ptrはマネージヒープ上にあるvalue type基本型を指すためのポインタです。 ​
  
 以下のコードを考えます。 ​ 以下のコードを考えます。 ​
ライン 23: ライン 23:
 } }
 </​code>​ </​code>​
-このコードはset100()でエラーになります。マネージヒープ上にあるものはポインタで受け取ることはできません。マネージヒープ上のデータはいつ場所が変わるかわからないため、純粋なアドレスを保持するポインタではまずいのです。+このコードはset100()でエラーになります。マネージヒープ上にあるものはポインタで受け取ることはできません。マネージヒープ上のデータはいつ場所が変わるかわからないため、純粋なアドレスを保持するポインタではまずいのです。 ​ 
  
 そこで以下のようにして見ます。 ​ そこで以下のようにして見ます。 ​
ライン 43: ライン 44:
 } }
 </​code>​ </​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/attic/cli/interior_ptr.1233370147.txt.gz · 最終更新: 2013/12/23 09:07 (外部編集)