我在OpenCV周围使用EmguCV wrapper。可以想象,Emgu充满了类IntPtr
指向非托管内存的类,如this property of the IImage
interface,由Mat
,UMat
和Image<,>
实现
我不知道这是否相关,但这些都是继承自Emgu自己的DisposableObject
和UnmanagedObject
抽象类。
在我所做的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)。