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# 内存泄漏 图片存储格式转换的主要内容,如果未能解决你的问题,请参考以下文章