halcon c# 内存泄漏 图片存储格式转换

Posted lonelyrains

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了halcon c# 内存泄漏 图片存储格式转换相关的知识,希望对你有一定的参考价值。

byte[]类型先专成IntPtr类型,然后转为HObject类型。转换代码:

IntPtr p = Marshal.AllocHGlobal(144);
Marshal.Copy(bytearray, 0, p, 144)
HOperaterSet.GenImage1Extern(out hobj, "byte", 12, 12, p, 0);

上面这段代码会申请一段内存,但是后续用完hobj之后,即使Dispose尝试释放内存也会失败(halcon在这里不会抛异常),因为这段内存不是直接在halcon中申请的,还有一个指针p在引用。从而导致内存溢出。

 

解决方法1:

在hobj.Dispose之前先使用GetImagePointer1获取hobj的图像指针,然后调用FreeHGlobal释放这个指针,然后才Dispose。

这个方法的弊端是,在外面Dispose的代码,要调用多余的获取指针的代码,代码不够优美。

 

解决方法2:

GenImage1Extern的最后一个参数是clearproc内存管理回调,利用这个回调来处理内存释放。halcon调用Dispose时会自动调用这个回调,并且自动填入调用参数。

HOperatorSet.GenImage1Extern(out hobj, "byte", 12, 12, p, Marshal.GetFunctionPointerForDelegate(callback));

HalconDotNet.HalconAPI.HClearProcCallBack callback = __OnFreeCallBack;
private static void __OnFreeCallBack(IntPtr pImg)

    Marshal.FreeHGlobal(pImg);

参考代码路径:C:\\Users\\Public\\Documents\\MVTec\\HALCON-xx.xx-Progress\\examples\\c#\\IACallback

以上是关于halcon c# 内存泄漏 图片存储格式转换的主要内容,如果未能解决你的问题,请参考以下文章

内存溢出和内存泄漏

c#怎么把byte数组转换成图像

使用 C# 的图像加载内存泄漏

字符串到 Char* 没有内存泄漏

c#应用程序中的ODBC泄漏内存

如何在eclipse中使用MAT查找内存泄漏