ユーザ用ツール

サイト用ツール


サイドバー

C++/CLI

CLR

実用編

その他

cli:pin_ptr

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




/var/www/html/virtual/cppcli/data/pages/cli/pin_ptr.txt · 最終更新: 2013/12/23 09:08 (外部編集)