如何在C++/C#中进行Halcon对象的垃圾回收?

  • 如何在C++/C#中进行Halcon对象的垃圾回收?已关闭评论
  • 147 次浏览
  • A+
所属分类:.NET技术
摘要

由于.NET 中是让垃圾收集器Garbage Collector (简称GC)删除未使用的对象。但是,由于GC只是不时地删除未使用的对象,因此同时使用的内存会增加。更重要的是,对于GC来说,HALCON 的标志性变量(图像、区域……)似乎相当“小”,因为它们只包含对(在许多情况下相当大)标志性对象的引用数据库。因此,GC可能不会释放这些变量,即使它们不再被使用。因此,您可能需要强制删除(未使用的)对象。有两种方法可以做到这一点:
第一种方式:手动调用GC
比如每次处理运行后在计时器事件中完成:

由于.NET 中是让垃圾收集器Garbage Collector (简称GC)删除未使用的对象。但是,由于GC只是不时地删除未使用的对象,因此同时使用的内存会增加。更重要的是,对于GC来说,HALCON 的标志性变量(图像、区域……)似乎相当“小”,因为它们只包含对(在许多情况下相当大)标志性对象的引用数据库。因此,GC可能不会释放这些变量,即使它们不再被使用。因此,您可能需要强制删除(未使用的)对象。有两种方法可以做到这一点:
第一种方式:手动调用GC
比如每次处理运行后在计时器事件中完成:

private void Timer_Tick(object sender, System.EventArgs e) {   Action();   GC.Collect();   GC.WaitForPendingFinalizers(); }

在托管 C++ 应用程序中调用GC的代码是:

GC::Collect(); GC::WaitForPendingFinalizers();

第二种方式:通过调用Dispose()方法手动处理单个对象

HImage  Image = new HImage("fuse");   ... Image.Dispose();

除了减少内存消耗,手动处理对象的另一个原因是释放资源,例如,关闭与图像采集设备或串行接口的连接。
如果要以确定的方式释放引用的资源,则还需要释放包含句柄的 HTuple实例。
请注意,HALCON 运算符总是为输出参数和返回值创建一个新的对象实例(但不是在修改调用实例的“类构造函数”运算符调用中)。如果变量已经初始化,它的旧内容(以及为其分配的内存)仍然存在,直到GC将其删除。如果你想手动删除它,你必须在给它分配一个对象之前调用Dispose 。