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

- hlrCalc 两处早退(HLR 结果为空、截面裁剪后为空)没有释放补充实体
  arAdditional_all,补上释放;第一处早退发生在轴网克隆插入 result1 之前,
  同时释放调用方移交所有权的 arAxisPtrs
- mergeEnvelope 找不到可用的 3DSOLID 时直接返回,漏掉 arptrs 里由
  GetDraw3dables 克隆出来的全部实体
- process_result 打成块失败时,subAr 里的实体没有被块表接管,需要自行释放
This commit is contained in:
company-desktop committed 2026-10-26 20:07:37 +08:00
1 parent bc16d46c13
commit 14f7203f3b
1 file changed
+10 -1
@@ -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;
}