如何固定'非托管'指针?

Gil*_*lad 6 c# pinvoke

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

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

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

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

  1. 如何固定返回的指针,以便GC不移动它(不会不安全)?'fixed'不会这样做,因为这个指针在整个班级中被广泛使用?
  2. 这个p/Invoke有更好的方法吗?

Han*_*ant 11

不,你正在找回一个永远不会移动的记忆指针.从本机堆分配的内存保持不变,与垃圾收集器使用的压缩策略没有任何相似之处.只有当内存管理系统可以找到指向已分配内存块的所有指针时,这才有效.这样它可以在块移动时更新这些指针.对于本机代码没有类似的东西,没有可靠的方法来找回这些指针.

不要费心寻找固定指针的方法.没有一个,因为没有必要.

  • 不,不是真的.SO引擎根据之前的答案在我的头版上推出这些问题.我想我注定永远在回答pinvoke问题;) (2认同)