2013-01-22 12 views
6

私はいくつかのパラメータを受け取り、メモリを割り当ててポインタを返す外部メソッドを持っています。「管理されていない」ポインタをピン止めする方法は?

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

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

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

  1. 返されたポインタを固定してGCが移動しないようにするにはどうしたらいいですか?このポインタはクラス全体で広く使われているので、 'fixed'はそれをしませんか?
  2. このp/Invokeにはより良い方法がありますか?
+1

アンマネージドポインタが移動する(iow change address)のはなぜですか?私はあなたの理解が間違っていると思います。管理対象オブジェクトをアンマネージコードで使用する場合にのみ修正が必要です。 – leppie

+0

GCは最適化(デフラグ)操作で管理オブジェクト(ポインタ)を移動します。 – Gilad

+1

あなたは管理されたポインタを使用していません。 – leppie

答えて

11

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

ポインタを固定する方法を探しても構いません。 1つは必要ないので、1つはありません。

+0

ハンス、あなたは5分ごとに "p-invoke"タグページをリフレッシュします、そうですか? :) – JerKimball

+2

いいえ、本当にありません。 SOエンジンは、これらの質問を前の答えに基づいてフロントページにプッシュします。私は永遠にピンボケの質問に答える運命にあると思う;) –

+1

http://uploads8.wikipaintings.org/images/titian/sisyphus-1549.jpg – JerKimball

関連する問題