{{indexmenu_n>11}}
====== pin_ptr ======
pin_ptrはマネージヒープ上のvalue typeや基本型をC++のポインタで扱う機能です。
前章のサンプルで、set100(int* p)を変更したくない場合は、pin_ptrを使います。
ref class R
{
public:
Object o;
int i;
};
void set100(int *i)
{
*i = 100;
}
int main()
{
R^ r = gcnew R;
pin_ptr p = &r->i;
set100(p);
p = nullptr; // unpin
}
pin_ptrを使ってpinすると、インスタンスすべて(この場合R)がpinされます。pin_ptrはなるべく早くunpinした方がいいと思います。
pin_ptr関係で以下のようなコンパイルエラーが出ることがあります。
error C2664: 'set100' : cannot convert parameter 1 from 'cli::interior_ptr' to 'int *'
エラーの出るソースは以下です。
ref class R
{
public:
Object o;
int i;
};
void set100(int *i)
{
*i = 100;
}
int main()
{
R^ r = gcnew R;
set100(&r->i); // ERROR
}
r はマネージヒープ上に存在するため、ポインタに変換することができないためです。