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