2013-01-22 57 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

相关问题