关于C# halcon内存泄漏的研究

简介: 关于C# halcon内存泄漏的研究

开发环境:Win7 VS2002 halcon12, 直接运行Debug的exe

不释放

private void butTemp_Click(object sender, EventArgs e)
        {
            HOperatorSet.SetSystem("clip_region", "false");
            HObject region;
            HOperatorSet.GenEmptyRegion(out region);
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 10000; j++)
                {
                    HObject tmpRegion;
                    HOperatorSet.GenRectangle1(out tmpRegion, i, j, i, j);
                    HOperatorSet.Union2(tmpRegion, region, out region);
                }
            HTuple tArea, tmp;
            HOperatorSet.AreaCenter(region, out tArea, out tmp, out tmp);
            Debug.Assert(tArea > 0);
            TestForm form = new TestForm();
            form.ShowDialog();
        }

不到一分钟运行结束,最多占用1G内存,运行结束占用800M内存。

释放tmpRegio

private void butTemp_Click(object sender, EventArgs e)
        {
            HOperatorSet.SetSystem("clip_region", "false");
            HObject region;
            HOperatorSet.GenEmptyRegion(out region);
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 10000; j++)
                {
                    HObject tmpRegion;
                    HOperatorSet.GenRectangle1(out tmpRegion, i, j, i, j);
                    HOperatorSet.Union2(tmpRegion, region, out region);
                    tmpRegion.Dispose();
                }
            HTuple tArea, tmp;
            HOperatorSet.AreaCenter(region, out tArea, out tmp, out tmp);
            Debug.Assert(tArea > 0);
            TestForm form = new TestForm();
            form.ShowDialog();
        }

不到一分钟运行结束,最多占用0.5G内存,运行结束占用0.5G 内存。

释放region

private void butTemp_Click(object sender, EventArgs e)
        {
            HOperatorSet.SetSystem("clip_region", "false");
            HObject region;
            HOperatorSet.GenEmptyRegion(out region);
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 10000; j++)
                {
                    HObject tmpRegion;
                    HOperatorSet.GenRectangle1(out tmpRegion, i, j, i, j);
                    HOperatorSet.Union2(tmpRegion, region, out region);
                    tmpRegion.Dispose();
                }
            HTuple tArea, tmp;
            HOperatorSet.AreaCenter(region, out tArea, out tmp, out tmp);
            Debug.Assert(tArea > 0);
            region.Dispose();
            TestForm form = new TestForm();
            form.ShowDialog();
        }

几乎没变化,还是0.5G左右

释放bak

private void butTemp_Click(object sender, EventArgs e)
        {
            HOperatorSet.SetSystem("clip_region", "false");
            HObject region;
            HOperatorSet.GenEmptyRegion(out region);
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 10000; j++)
                {
                    HObject tmpRegion;
                    HOperatorSet.GenRectangle1(out tmpRegion, i, j, i, j);
                    HObject bak = region;
                    HOperatorSet.Union2(tmpRegion, region, out region);
                    bak.Dispose();
                    tmpRegion.Dispose();
                }
            HTuple tArea, tmp;
            HOperatorSet.AreaCenter(region, out tArea, out tmp, out tmp);
            Debug.Assert(tArea > 0);
            region.Dispose();
            TestForm form = new TestForm();
            form.ShowDialog();
        }

不到一分钟运行结束,内存几乎没增加,不到20M以内。

结论

Union2的出参和入参一致时,必须手动释放,这样才能100% 马上回收内存。


相关文章
|
4月前
|
存储 Java C#
C# 中的值类型与引用类型:内存大小解析
C# 中的值类型与引用类型:内存大小解析
|
2月前
|
开发框架 人工智能 自然语言处理
基于ChatGPT的API的C#接入研究
基于ChatGPT的API的C#接入研究
|
5月前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
38 0
|
5月前
|
存储 安全 程序员
C内存管理研究
C内存管理研究
35 2
|
5月前
|
存储 C#
C# | 内存池
内存池可以复用已申请的内存空间,它在程序启动时预先分配一定数量的内存块,当你需要使用内存时,则会从内存池中分配一块空闲内存,也就是说并不是每次都会向系统申请一块新的内存空间。 同理,当你使用完一块内存空间后,并不是直接释放内存,而是将其归还到内存池中。内存池就是通过这样一借一还的方式避免了频繁地分配和释放内存,减少了内存碎片和系统开销,提高了程序的性能。
61 0
|
5月前
|
存储 Java C#
C# | 使用Memory<T>高效地读写内存数据
Memory<T>是什么? 它是一种可变大小、可读写的内存块,可以安全地暴露给用户代码进行操作。 为什么要使用Memory<T>? 使用它有许多好处。最主要的是善用它可以提高代码的性能。因为Memory<T>是可变的,所以我们可以直接在内存中操作数据,而不需要进行额外的拷贝操作。 使用Memory<T>还可以减少垃圾回收的压力,因为我们不需要创建新的对象来存储数据。 Memory<T>还可以与Span<T>和ReadOnlySpan<T>类型一起使用,这些类型可以方便地对数据进行访问和操作。
95 0
|
10月前
|
存储 Java C#
C# 垃圾回收机制(GC) 的概述 资源清理 内存管理
C# 垃圾回收机制(GC) 的概述 资源清理 内存管理
|
10月前
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
|
12月前
|
测试技术 C#
C#不通过byte[],直接对内存映射文件复制内存
C#不通过byte[],直接对内存映射文件复制内存
|
机器学习/深度学习 人工智能 缓存
为内存塞不下Transformer犯愁?OpenAI应用AI研究负责人写了份指南(3)
为内存塞不下Transformer犯愁?OpenAI应用AI研究负责人写了份指南
310 0

热门文章

最新文章

下一篇
无影云桌面