【问题标题】:How to pin an 'unmanaged' pointer?如何固定“非托管”指针?
【发布时间】: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 方。

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

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

【问题讨论】:

  • 为什么非托管指针会移动(iow 更改地址)?我认为你的理解是错误的。只有在非托管代码中使用托管对象时才需要修复。
  • GC 在其优化(碎片整理)操作中移动托管对象(指针)。
  • 你没有使用托管指针。

标签: c# pinvoke


【解决方案1】:

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

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

【讨论】:

  • 汉斯,你每五分钟左右刷新一次“p-invoke”标签页面,对吗? :)
  • 不,不是。 SO 引擎根据之前的答案将这些问题推送到我的首页。我想我注定要永远回答 pinvoke 问题了;)
猜你喜欢
  • 1970-01-01
  • 2011-07-03
  • 2011-10-16
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多