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