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<int> 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<Type>' 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 はマネージヒープ上に存在するため、ポインタに変換することができないためです。