私はいくつかのパラメータを受け取り、メモリを割り当ててポインタを返す外部メソッドを持っています。「管理されていない」ポインタをピン止めする方法は?
[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
Size size,
int a,
int b);
私は管理されたアプリケーションで管理されていないメモリを割り当てるために悪い習慣であることを十分承知しているが、この場合には、私は、DLLがサードパーティであるとして、選択の余地はありません。
メモリを解放する同等の機能があり、割り当てられた配列のサイズがわかります。
- 返されたポインタを固定してGCが移動しないようにするにはどうしたらいいですか?このポインタはクラス全体で広く使われているので、 'fixed'はそれをしませんか?
- このp/Invokeにはより良い方法がありますか?
アンマネージドポインタが移動する(iow change address)のはなぜですか?私はあなたの理解が間違っていると思います。管理対象オブジェクトをアンマネージコードで使用する場合にのみ修正が必要です。 – leppie
GCは最適化(デフラグ)操作で管理オブジェクト(ポインタ)を移動します。 – Gilad
あなたは管理されたポインタを使用していません。 – leppie