修复相机 HLR 计算链路上的几处内存泄漏 #76

Merged
gjm merged 1 commits from company-desktop-computer/fix-aecdbcamera-hlr-leak AGit into main 2026-10-26 20:27:00 +08:00
@@ -771,7 +771,11 @@ namespace
break;
}
if (!pSolidAll) return NULL;
if (!pSolidAll)
{
deleteArrayVoidPtrs<AcDbEntity>(arptrs);
return NULL;
}
if (arptrs.isEmpty()) return pSolidAll;
@@ -1117,6 +1121,8 @@ namespace
{ // 如果 ent 是 块参照,它不会有补充实体,结果需要打成块
// 块的属性和 pRef 一样
AcDbBlockReference *pSubRef = CoreTools::makeBlockReference(subAr, NULL);
if (!pSubRef) // 打成块失败时,subAr 里的实体没有被块表接管,需要自己释放
deleteArrayVoidPtrs<AcDbEntity>(subAr);
subAr.removeAll();
if (pSubRef)
{
@@ -2067,6 +2073,8 @@ void AecDbXCamera::hlrCalc(AcDbObjectIdArray &arIds
// 如果实体的PreprocessForHlr函数内,设置了 HLR_CALC,从而影响实体的 Draw3d 函数的返回
// 那么,其PreprocessForHlr函数一定要无条件设置回来
// rollback 回调用其内部的PreprocessForHlr函数
deleteContainerOfArx<AcDbEntity>(arAdditional_all);
deleteContainerOfArx<AcDbEntity>(arAxisPtrs);
rollback(arIds);
return;
}
@@ -2083,6 +2091,7 @@ void AecDbXCamera::hlrCalc(AcDbObjectIdArray &arIds
// 如果裁剪之后,没有结果了,回退实体状态
if (result1.empty() && result2.empty())
{
deleteContainerOfArx<AcDbEntity>(arAdditional_all);
rollback(arIds);
return;
}