この文書の現在のバージョンと選択したバージョンの差分を表示します。
cli:pin_ptr [2009/02/03 07:16] admin |
cli:pin_ptr [2013/12/23 09:08] |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | {{indexmenu_n>11}} | ||
- | ====== pin_ptr ====== | ||
- | |||
- | pin_ptrはマネージヒープ上のvalue typeや基本型をC++のポインタとして扱う機能です。 | ||
- | |||
- | 前章のサンプルで、set100(int* p)を変更したくない場合は、pin_ptrを使います。 | ||
- | |||
- | <code cpp> | ||
- | 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 | ||
- | } | ||
- | </code> | ||
- | |||
- | pin_ptrを使ってpinすると、インスタンスすべて(この場合R)がpinされます。pin_ptrはなるべく早くunpinした法がいいと思います。 | ||
- | |||
- | pin_ptr関係で以下のようなコンパイルエラーが出ることがあります。 | ||
- | |||
- | error C2664: 'set100' : cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'int *' | ||
- | |||
- | エラーの出るソースは以下です。 | ||
- | |||
- | <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); // ERROR | ||
- | } | ||
- | </code> | ||
- | r はマネージヒープ上に存在するため、ポインタに変換することができないためです。 |