2013-01-22 86 views
6

我有一個外部方法,它接收一些參數,分配內存並返回一個指針。如何固定'非託管'指針?

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

我很清楚,這是不好的做法,在管理應用程序分配非託管內存,但是在這種情況下,我別無選擇,因爲DLL是第三方。

有一個釋放內存的等價函數,我知道分配數組的大小是多少。

  1. 如何固定返回的指針,使GC不移動它(不會不安全)? '固定'不會這樣做,因爲這個指針在整個班級中被廣泛使用?
  2. 這個p/Invoke有更好的方法嗎?
+1

爲什麼非託管指針會移動(低位更改地址)?我認爲你的理解是錯誤的。只有在非託管代碼中使用託管對象時才需要修復。 – leppie

+0

GC在優化(碎片整理)操作中移動託管對象(指針)。 – Gilad

+1

那麼你沒有使用託管指針。 – leppie

回答

11

不,你正在找回內存的指針,將從來沒有移動。從本地堆分配的內存保持不變,沒有類似於垃圾收集器使用的壓縮策略。這隻有在內存管理系統可以找到所有指向分配的內存塊的指針時才能起作用。這樣它可以在塊移動時更新這些指針。沒有類似的東西存在於本地代碼中,沒有可靠的方法來找回這些指針。

不要打擾尋找一種方法來固定指針。沒有一個,因爲不需要一個。

+0

漢斯,你每五分鐘刷新一次「p-invoke」標籤頁,我說得對嗎? :) – JerKimball

+2

不,不是真的。 SO引擎根據先前的答案將這些問題推到我的首頁上。我想我註定要永遠回答問題;) –

+1

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

相關問題