refactor: 统一 XPrimData::m_pData 为字节数组,releaseData 只保留 delete[]
releaseData() 原来按 m_eType 分两路(8 种 delete[],其余 delete),但同一类型 在内存里可能是对象也可能是字节数组:开图、JSON 导入、深拷贝都分配 new byte[], 而对话框里 setData<T> 的 default 分支和几处直接 new 分配的是对象。按类型判断 必然有一半场景不匹配。 - 13 处对象形式分配统一改成 new unsigned char[sizeof(T)],后续 (T*)m_pData 的用法不变 - releaseData() 去掉 switch,只保留 delete[];~XPrimData() 改为先调 releaseData(), 顺带修掉 m_Combins 子单元的 m_pData 泄漏 - AecDbEwEquipment::FreeSubPrimData() 取代 FreeBuffer(CPtrArray&),改成成员函数, 不再需要参数 - 另外三个文件作用域的 FreeBuffer/FreeBuffer2/FreeBuffer3 改名为 FreeEntityArray/ FreeComplexCurveArray/FreeFaceplanArray,并加 static 收回内部链接 - 删除 ReleaseXPrimData,直接 releaseData() + DELETE_PTR
This commit is contained in:
1 parent
03bbe08b76
commit
41397130e2
15 files changed
+108
-89
No files matched your search
@@ -169,19 +169,6 @@ namespace
|
||||
return pData;
|
||||
}
|
||||
|
||||
//释放一个几何单元。m_pData 在 copyXPrimData、dwgInFieldsForXPrim、byJson
|
||||
//等处一律用 new byte[] / new PVOID[] 分配,必须用 delete[],再删结构体本身
|
||||
void ReleaseXPrimData(AecEqui::XPrimData* pData)
|
||||
{
|
||||
if (pData == NULL) return;
|
||||
if (pData->m_pData != NULL)
|
||||
{
|
||||
delete[](byte*)pData->m_pData;
|
||||
pData->m_pData = NULL;
|
||||
}
|
||||
DELETE_PTR(pData);
|
||||
}
|
||||
|
||||
AecEqui::XPrimData* dwgInFieldsForXPrim(AcDbDwgFiler *pFiler, const Adesk::UInt32 &CurrentVer)
|
||||
{
|
||||
Adesk::Int16 nType = 0;
|
||||
@@ -884,7 +871,7 @@ namespace
|
||||
}
|
||||
|
||||
#pragma region
|
||||
void FreeBuffer2(CPtrArray& arCplptrs)
|
||||
static void FreeComplexCurveArray(CPtrArray& arCplptrs)
|
||||
{
|
||||
for (int i = 0; i < arCplptrs.GetSize(); i++)
|
||||
{
|
||||
@@ -897,7 +884,7 @@ namespace
|
||||
arCplptrs.RemoveAll();
|
||||
}
|
||||
|
||||
void FreeBuffer3(CPtrArray& arCplptrs)
|
||||
static void FreeFaceplanArray(CPtrArray& arCplptrs)
|
||||
{
|
||||
for (int i = 0; i < arCplptrs.GetSize(); i++)
|
||||
{
|
||||
@@ -1519,7 +1506,7 @@ namespace
|
||||
return bOk;
|
||||
}
|
||||
|
||||
void FreeBuffer(AcDbVoidPtrArray& arEntPtrs)
|
||||
static void FreeEntityArray(AcDbVoidPtrArray& arEntPtrs)
|
||||
{
|
||||
AcDbEntity* pEnt = NULL;
|
||||
while (arEntPtrs.length() > 0)
|
||||
@@ -1530,16 +1517,6 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
void FreeBuffer(CPtrArray& arSubPrimPtrs)
|
||||
{
|
||||
for (int i = 0; i < arSubPrimPtrs.GetSize(); i++)
|
||||
{
|
||||
//原来只 delete[] m_pData、不删结构体,结构体全部泄漏
|
||||
ReleaseXPrimData((AecEqui::XPrimData*)arSubPrimPtrs.GetAt(i));
|
||||
}
|
||||
arSubPrimPtrs.RemoveAll();
|
||||
}
|
||||
|
||||
void TransformEntity(AcDbEntity *p
|
||||
, const AcGePoint3d &ptIns
|
||||
, const AcGeVector3d &vtDir
|
||||
@@ -1694,7 +1671,7 @@ AecDbEwEquipment::~AecDbEwEquipment(void)
|
||||
{
|
||||
Clean3DBuffer();
|
||||
Clean2DBuffer();
|
||||
FreeBuffer(m_arSubPrimPtrs);
|
||||
FreeSubPrimData();
|
||||
delete [] m_pGripAppData;
|
||||
}
|
||||
|
||||
@@ -1738,7 +1715,7 @@ Acad::ErrorStatus AecDbEwEquipment::dwgInFields(AcDbDwgFiler* pFiler)
|
||||
pFiler->readInt32(&nLen);
|
||||
|
||||
//重新读入前先释放旧几何,只 RemoveAll 会漏掉结构体和参数块
|
||||
FreeBuffer(m_arSubPrimPtrs);
|
||||
FreeSubPrimData();
|
||||
AecEqui::XPrimData* pSolid = NULL;
|
||||
|
||||
Adesk::Int16 nType = 0;
|
||||
@@ -2186,9 +2163,8 @@ Acad::ErrorStatus AecDbEwEquipment::copyFrom(const AcRxObject* pSrc)
|
||||
|
||||
AecDbEntityBase::copyFrom(pSrc);
|
||||
|
||||
//FreeBufer!!!!
|
||||
FreeBuffer(m_arSubPrimPtrs);
|
||||
m_arSubPrimPtrs.RemoveAll();
|
||||
//先释放旧几何,否则被覆盖的那批结构体和参数块全部泄漏
|
||||
FreeSubPrimData();
|
||||
|
||||
AecDbEwEquipment* pImp = (AecDbEwEquipment*)pSrc;
|
||||
if (pImp != NULL)
|
||||
@@ -3173,7 +3149,12 @@ void AecDbEwEquipment::subDMesh2NewSolid()
|
||||
for (int i((int)idxs.size() - 1); i >= 0; --i)
|
||||
{
|
||||
int nIndex = idxs[i];
|
||||
ReleaseXPrimData((AecEqui::XPrimData *)m_arSubPrimPtrs[nIndex]);
|
||||
AecEqui::XPrimData *p = (AecEqui::XPrimData *)m_arSubPrimPtrs[nIndex];
|
||||
if (p != NULL)
|
||||
{
|
||||
p->releaseData();
|
||||
DELETE_PTR(p);
|
||||
}
|
||||
m_arSubPrimPtrs.RemoveAt(nIndex);
|
||||
}
|
||||
|
||||
@@ -4284,6 +4265,20 @@ void AecDbEwEquipment::AddSubPrimObj(AecEqui::XPrimData* p)
|
||||
m_arSubPrimPtrs.Add(pData);
|
||||
}
|
||||
|
||||
void AecDbEwEquipment::FreeSubPrimData()
|
||||
{
|
||||
for (int i = 0; i < m_arSubPrimPtrs.GetSize(); i++)
|
||||
{
|
||||
AecEqui::XPrimData* pData = (AecEqui::XPrimData*)m_arSubPrimPtrs.GetAt(i);
|
||||
if (pData != NULL)
|
||||
{
|
||||
pData->releaseData();
|
||||
DELETE_PTR(pData);
|
||||
}
|
||||
}
|
||||
m_arSubPrimPtrs.RemoveAll();
|
||||
}
|
||||
|
||||
void AecDbEwEquipment::RemoveSubPrimObj(int nIndex)
|
||||
{
|
||||
AssertWriteEnabled();
|
||||
@@ -4293,7 +4288,8 @@ void AecDbEwEquipment::RemoveSubPrimObj(int nIndex)
|
||||
pSolid = (AecEqui::XPrimData*)m_arSubPrimPtrs.GetAt(nIndex);
|
||||
m_arSubPrimPtrs.RemoveAt(nIndex);
|
||||
m_mapSpecXData.RemoveAt(TypeConvert::i2s(pSolid->m_nID) + _T(":color"));
|
||||
ReleaseXPrimData(pSolid);
|
||||
pSolid->releaseData();
|
||||
DELETE_PTR(pSolid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4308,7 +4304,8 @@ void AecDbEwEquipment::RemoveSubPrimObjByID(int nSubID)
|
||||
{
|
||||
m_arSubPrimPtrs.RemoveAt(i);
|
||||
m_mapSpecXData.RemoveAt(TypeConvert::i2s(pSolid->m_nID) + _T(":color"));
|
||||
ReleaseXPrimData(pSolid);
|
||||
pSolid->releaseData();
|
||||
DELETE_PTR(pSolid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -8537,8 +8534,8 @@ void AecDbEwEquipment::PrimPorjectToPlan(AecComplexCurve& cplCurve, AecEqui::XVi
|
||||
}
|
||||
|
||||
//3.释放内存
|
||||
FreeBuffer2(arPrimCplPtrs);
|
||||
FreeBuffer3(arFaceplanPtrs);
|
||||
FreeComplexCurveArray(arPrimCplPtrs);
|
||||
FreeFaceplanArray(arFaceplanPtrs);
|
||||
}
|
||||
|
||||
void AecDbEwEquipment::PrimBoxPorjectToPlan(AecComplexCurve& cplCurve, AecEqui::XView eview, const AcGeVector3d& vtNor, AecEqui::XPrimData* p3dSolid, Aec3dFaceplan* pPlan, BOOL bMakeCenterLine /*= FALSE*/, BOOL bOnlyGetFace /*= FALSE*/) const
|
||||
@@ -11361,7 +11358,7 @@ void AecDbEwEquipment::SplitCrvOnIntersect(AecComplexCurve* pCrvDn, AecComplexCu
|
||||
AecCoverBooleanOper::SortPoints(arPts, pDbCrvDn);
|
||||
pDbCrvDn->getSplitCurves(arPts, arSegPtrs);
|
||||
AppendSegment(elDn, cplexDn, arSegPtrs, dZ);
|
||||
FreeBuffer(arSegPtrs);
|
||||
FreeEntityArray(arSegPtrs);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -11375,7 +11372,7 @@ void AecDbEwEquipment::SplitCrvOnIntersect(AecComplexCurve* pCrvDn, AecComplexCu
|
||||
|
||||
*pCrvDn = cplexDn;
|
||||
|
||||
FreeBuffer(arUpCrvPtrs);
|
||||
FreeEntityArray(arUpCrvPtrs);
|
||||
}
|
||||
|
||||
AcDbCurve* AecDbEwEquipment::CurveElement2DbCurve(AecEqui::AecCurveElement el) const
|
||||
@@ -12662,7 +12659,7 @@ bool AecDbEwEquipment::OldGetSectionDraw(AcGePlane &plan, const AcGeVector3d &vt
|
||||
}
|
||||
}
|
||||
//GetDraw3dables 产出的整组克隆,原来从头到尾没释放
|
||||
FreeBuffer(arSubPtrs);
|
||||
FreeEntityArray(arSubPtrs);
|
||||
|
||||
CString sName;
|
||||
m_mapSpecXData.GetAt(KEY_NAME, sName);
|
||||
@@ -12889,7 +12886,7 @@ bool AecDbEwEquipment::ByJson(const SHJson::WValue &v)
|
||||
if (!it->value.IsArray()) return false;
|
||||
|
||||
//先释放旧几何,否则对已有对象再导入会叠加重复单元
|
||||
FreeBuffer(m_arSubPrimPtrs);
|
||||
FreeSubPrimData();
|
||||
|
||||
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i)
|
||||
{
|
||||
@@ -12897,7 +12894,11 @@ bool AecDbEwEquipment::ByJson(const SHJson::WValue &v)
|
||||
if (byJson(*i, p))
|
||||
m_arSubPrimPtrs.Add(p);
|
||||
else
|
||||
ReleaseXPrimData(p); //解析失败,原来既不进数组也不释放
|
||||
{
|
||||
//解析失败,原来既不进数组也不释放
|
||||
p->releaseData();
|
||||
DELETE_PTR(p);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in new issue
Block a user