我有一个外部方法接收一些参数,分配内存并返回一个指针。
[DllImport("some.dll", CallingConvention = CvInvoke.CvCallingConvention)]
public static extern IntPtr cvCreateHeader(
Size size,
int a,
int b);
我很清楚在托管应用程序中分配非托管内存是不好的做法,但在这种情况下我没有选择,因为dll是第三方。
有一个等效的函数可以释放内存,我知道分配的数组的大小是多少。
答案 0 :(得分:11)
不,你正在找回一个指向永远不会移动的内存的指针。从本机堆分配的内存保持不变,与垃圾收集器使用的压缩策略没有任何相似之处。只有当内存管理系统可以找到指向已分配内存块的所有指针时,这才有效。这样它可以在块移动时更新这些指针。对于本机代码没有类似的东西,没有可靠的方法来找回这些指针。
不要费心寻找固定指针的方法。没有一个,因为没有必要。