开发环境: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% 马上回收内存。