我可以复制对非托管内存的引用而不会导致内存泄漏吗?

时间:2015-07-14 17:34:39

标签: c# pointers unmanaged emgucv

上下文

我在OpenCV周围使用EmguCV wrapper。可以想象,Emgu充满了类IntPtr指向非托管内存的类,如this property of the IImage interface,由MatUMatImage<,>实现

我不知道这是否相关,但这些都是继承自Emgu自己的DisposableObjectUnmanagedObject抽象类。

  • 我很擅长使用Java,Python和Ruby,他们的垃圾收集器很聪明。
  • 我很高兴在C中工作,我的堆数组和结构是我自己的问题。

在我所做的Java-calling-C风格的JNI本机互操作中,使用JNI函数显式提取数组并从JVM堆转换数组。然后你可以在C中弄乱数组,但你必须再次使用JNI函数将数组复制到Java returnable或输出参数。这隔离了C内存管理和Java内存管理 - 它们彼此不关心。

但是在C#native interop world中,我发现你可以直接使用IntPtr指针!如果我想通过快速解除引用和指针算法做一些聪明/危险的事情,这很方便,但我对于操纵它们甚至存储对它们的引用感到非常狡猾。

问题

如果我这样做

var img = new Image<RGB, byte>("filename.jpg");
IntPtr myPtr = img.Ptr;

对于非托管内存,垃圾收集器是否会导致内存泄漏?或myPtr是参考图表中的另一个链接,使img无法自动处理?

或者它取决于本机代码及其包装器? (在我的案例中打开/ EmguCV)。

0 个答案:

没有答案