如何固定“非托管”指针

本文关键字:非托管 指针 何固定 | 更新日期: 2023-09-27 17:55:14

我有一个外部方法,它接收一些参数,分配内存并返回指针。

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

很清楚在托管应用程序中分配非托管内存是一种不好的做法,但在这种情况下,我别无选择,因为 dll 是第三方。

有一个等效的函数可以释放内存,我知道分配的数组的大小是多少。

  1. 如何固定返回的指针,以便 GC 不会移动它(而不会变得不安全)?"固定"不会这样做,因为这个指针在整个类中被广泛使用?
  2. 对于这个p/Invoke,有没有更好的方法?

如何固定“非托管”指针

不,你得到的是一个永远不会移动的内存指针。 从本机堆分配的内存保持不变,没有什么类似于垃圾回收器使用的压缩策略。 仅当内存管理系统可以找到指向已分配内存块的所有指针时,这才有效。 以便它可以在块移动时更新这些指针。 本机代码不存在这样的东西,没有可靠的方法来查找这些指针。

不要费心寻找固定指针的方法。 没有,因为不需要。