【发布时间】:2013-01-05 15:56:57
【问题描述】:
我有一个外部方法,它接收一些参数,分配内存并返回一个指针。
[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
Size size,
int a,
int b);
我很清楚在托管应用程序中分配非托管内存是一种不好的做法,但在这种情况下我别无选择,因为 dll 是第 3 方。
有一个等效的函数可以释放内存,我知道分配数组的大小。
- 如何固定返回的指针以使 GC 不会移动它(不会变得不安全)? 'fixed' 不会这样做,因为这个指针在整个班级中被广泛使用?
- 此 p/Invoke 是否有更好的方法?
【问题讨论】:
-
为什么非托管指针会移动(iow 更改地址)?我认为你的理解是错误的。只有在非托管代码中使用托管对象时才需要修复。
-
GC 在其优化(碎片整理)操作中移动托管对象(指针)。
-
你没有使用托管指针。