6

いくつかのパラメーターを受け取り、メモリを割り当て、ポインターを返す外部メソッドがあります。

[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
       Size size,
       int a,
       int b);

管理されたアプリケーションに管理されていないメモリを割り当てるのは悪い習慣であることをよく知っていますが、この場合、dll はサード パーティであるため選択の余地がありません。

メモリを解放する同等の関数があり、割り当てられた配列のサイズはわかっています。

  1. 返されたポインターをピン留めして、GC が (危険にならないように) 移動しないようにするにはどうすればよいですか? このポインターはクラス全体で広く使用されているため、「固定」はそれを行いませんか?
  2. この p/Invoke のためのより良い方法論はありますか?
4

1 に答える 1

11

いいえ、決して移動しないメモリへのポインターを取得しています。ネイティブ ヒープから割り当てられたメモリはそのまま残ります。ガベージ コレクタが使用する圧縮戦略に似たものはありません。これは、メモリ管理システムが、割り当てられたメモリのチャンクを指すすべてのポインタを見つけることができる場合にのみ機能します。チャンクが移動したときにこれらのポインターを更新できるようにします。ネイティブ コードにはそのようなものは存在しません。それらのポインターを見つけるための信頼できる方法はありません。

ポインターを固定する方法を探す必要はありません。必要がないので、ありません。

于 2013-01-22T12:32:11.360 に答える