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:
company-desktop committed 2026-10-23 10:29:31 +08:00
1 parent 03bbe08b76
commit 41397130e2
15 files changed
+108 -89

No files matched your search

+41 -14
View File
@@ -89,7 +89,7 @@ AecDbEwEquipment::~AecDbEwEquipment(void) // :1686
同类 `AecDbEwFitting` 的析构(`:584`)同样没处理它的子单元数组,属于同一批遗留写法。 同类 `AecDbEwFitting` 的析构(`:584`)同样没处理它的子单元数组,属于同一批遗留写法。
**修复**:析构里补 `FreeBuffer(m_arSubPrimPtrs);`(该函数已存在,见 2.3,需先修 2.3)。 **修复**:析构里补 `FreeSubPrimData();`(成员函数,见 2.3 与 2.13)。
### 2.3 P0:`FreeBuffer(CPtrArray&)` 只释放数据块,不释放结构体 ### 2.3 P0:`FreeBuffer(CPtrArray&)` 只释放数据块,不释放结构体
@@ -109,9 +109,28 @@ void FreeBuffer(CPtrArray& arSubPrimPtrs) // :1520
被 `copyFrom:2181` 调用,于是 `copyFrom` 每次都泄漏被覆盖的那批 `XPrimData` 结构体。修 2.2 时会连带放大这个问题。 被 `copyFrom:2181` 调用,于是 `copyFrom` 每次都泄漏被覆盖的那批 `XPrimData` 结构体。修 2.2 时会连带放大这个问题。
另外这里无条件 `delete[](byte*)`,而 `releaseData()` 是按类型区分 `delete[]` / `delete` 的。`byJson`(`:820`)用 `new PVOID[]` 分配,属于数组,`delete[]` 恰好对。 另外这里无条件 `delete[](byte*)`,而 `releaseData()` 是按类型区分 `delete[]` / `delete` 的。
**修复时没有改用 `releaseData()`**:核实后发现 `releaseData()`(`EarThwormDef.h:2544`)的 `default` 分支用的是标量 `delete`,而 `m_pData` 的全部分配点(`copyXPrimData:150`、`dwgInFieldsForXPrim:193`、`byJson:820`、`:4472`)都是 `new byte[]` / `new PVOID[]`,标量 `delete` 反而与分配不匹配。所以本次统一走 `delete[](byte*)` + `DELETE_PTR(pData)`,封装成 `ReleaseXPrimData()` 供四处复用。`releaseData()` 自身这个不一致留待单独处理(它影响的是所有 `XPrimData` 的释放路径,不只是本文件)。 **核查 `m_pData` 的全部分配点后,结论是 `releaseData()` 的类型判断不可靠**——同一个类型在内存里可能是对象,也可能是字节数组:
| 来源 | 分配形式 |
| --- | --- |
| `dwgInFieldsForXPrim:206`(开图) | `new byte[n]`,所有类型 |
| `byJson:833`(JSON 导入) | `new PVOID[n]`,所有类型 |
| `copyXPrimData:150`(深拷贝) | `new byte[n]`,所有类型 |
| `CoreTools.cpp:2036` / `:4565` / `:4662` | `new byte[]` / `new char[]` |
| 各命令模块的 `setData<T>`(8 处) | `kExtrude`/`kRevolve` 用 `new byte[]`,其余 `new T` |
| `PipelineCmd/command.cpp:18670` 等 5 处 | `new AecEqui::XNozz` / `new AecEqui::XBOX` |
例如 `kBox` 从对话框创建时是 `new AecEqui::XBOX`,开图读回时却是 `new byte[]`。按 `m_eType` 判断,必然有一半场景不匹配(MSVC 下 POD 数组的 `delete` 与 `delete[]` 实际都走 `free`,所以一直没暴露)。
**改法:统一表示,再统一释放规则。**
1. 把 13 处对象形式的分配改成 `new unsigned char[sizeof(T)]`(`sizeof(T)` 与原来一致,后续 `(T*)m_pData` 的用法不变)
2. `releaseData()` 去掉 switch,只保留 `delete[] (unsigned char*)m_pData`
3. `~XPrimData()` 改为先调 `releaseData()`,顺带修掉 `m_Combins` 子单元的 `m_pData` 泄漏
这样 `AecDbEwEquipment.cpp` 里的 `ReleaseXPrimData` 就不需要了,直接 `pData->releaseData(); DELETE_PTR(pData);`。
### 2.4 P0:`subDMesh2NewSolid()` 删错元素,且泄漏 ### 2.4 P0:`subDMesh2NewSolid()` 删错元素,且泄漏
@@ -219,23 +238,31 @@ delete pEnt; // :4049 只删了 exp
| # | 实际改法 | 与原方案的差异 | | # | 实际改法 | 与原方案的差异 |
| --- | --- | --- | | --- | --- | --- |
| 1 | 删掉 `dwgInFields` 里的 `new AecGripData[GRIP_MAXNUM]`;`readString` 后补 `acutDelString(pszTmp)` | 同原方案 | | 1 | 删掉 `dwgInFields` 里的 `new AecGripData[GRIP_MAXNUM]`;`readString` 后补 `acutDelString(pszTmp)` | 同原方案 |
| 2 | 析构补 `FreeBuffer(m_arSubPrimPtrs)` | 同原方案 | | 2 | 析构补 `FreeSubPrimData()` | 同原方案 |
| 3 | 新增 `ReleaseXPrimData()`(匿名 namespace),`FreeBuffer(CPtrArray&)` 改为调用它 | 没用 `releaseData()`,原因见 2.3 | | 3 | `FreeSubPrimData()` 成员函数:逐个 `releaseData()` + `DELETE_PTR`,最后 `RemoveAll` | 见 2.3,先统一了 `m_pData` 表示 |
| 4 | `subDMesh2NewSolid()` 按 `idxs` 倒序 `ReleaseXPrimData` + `RemoveAt` | 同原方案,另把 `size_t i` 改成 `int i` 倒序 | | 4 | `subDMesh2NewSolid()` 按 `idxs` 倒序释放 + `RemoveAt` | 同原方案,另把 `size_t i` 改成 `int i` 倒序 |
| 5 | `RemoveSubPrimObj` / `RemoveSubPrimObjByID` 改用 `ReleaseXPrimData` | 同原方案 | | 5 | `RemoveSubPrimObj` / `RemoveSubPrimObjByID` 改用 `releaseData()` + `DELETE_PTR` | 同原方案 |
| 6 | `GetDraw2dables` 两个 `continue` 前补 `DELETE_PTR(pClnEnt)` | 同原方案 | | 6 | `GetDraw2dables` 两个 `continue` 前补 `DELETE_PTR(pClnEnt)` | 同原方案 |
| 7 | `OldGetSectionDraw` 循环内补 `DELETE_PTR(pSubCln)`、循环后补 `FreeBuffer(arSubPtrs)`;`GetSectionDraw` 两处 `return OldGetSectionDraw` 前补 `delete pFit` | 同原方案 | | 7 | `OldGetSectionDraw` 循环内补 `DELETE_PTR(pSubCln)`、循环后补 `FreeEntityArray(arSubPtrs)`;`GetSectionDraw` 两处 `return OldGetSectionDraw` 前补 `delete pFit` | 同原方案 |
| 8 | `convertToRegion` 的 `regions` 循环结束后逐个 `DELETE_PTR`;顺带把内层遮蔽的 `i` 改为 `j` | 同原方案 | | 8 | `convertToRegion` 的 `regions` 循环结束后逐个 `DELETE_PTR`;顺带把内层遮蔽的 `i` 改为 `j` | 同原方案 |
| 9 | `SortAecComplexCurves` 空曲线改为 `DELETE_PTR` | 同原方案,另补 `pCrv == NULL` 判断 | | 9 | `SortAecComplexCurves` 空曲线改为 `DELETE_PTR` | 同原方案,另补 `pCrv == NULL` 判断 |
| 10 | `ByJson` 循环前 `FreeBuffer(m_arSubPrimPtrs)`,`byJson` 失败时 `ReleaseXPrimData(p)` | 同原方案 | | 10 | `ByJson` 循环前 `FreeSubPrimData()`,`byJson` 失败时 `releaseData()` + `DELETE_PTR` | 同原方案 |
| 11 | `MakeBlockRefSet` 的 `getBlockTable` / `pTbl->add` 失败时 `pRec->close()` 并返回 `false` | 同原方案 | | 11 | `MakeBlockRefSet` 的 `getBlockTable` / `pTbl->add` 失败时 `pRec->close()` 并返回 `false` | 同原方案 |
| 12 | `dwgInFields` 的 `m_arSubPrimPtrs.RemoveAll()` 改为 `FreeBuffer` | 新增,原注释写着 FreeBufer 但没真释放 | | 12 | `dwgInFields` 的 `m_arSubPrimPtrs.RemoveAll()` 改为 `FreeSubPrimData()` | 新增,原注释写着 FreeBufer 但没真释放 |
| 13 | `GetDraw3dables` 的 `booleanOper(kBoolUnite)` 之后补 `DELETE_PTR(pSolid)` | 新增,见 3.15 | | 13 | `GetDraw3dables` 的 `booleanOper(kBoolUnite)` 之后补 `DELETE_PTR(pSolid)` | 新增,见 3.15 |
**函数命名整理**(`AecDbEwEquipment.cpp` 原来有 4 个文件作用域、外部链接的 `FreeBuffer*`,与其他 cpp 里的同名 `static` 函数容易混淆):
| 原名 | 现名 | 说明 |
| --- | --- | --- |
| `FreeBuffer(CPtrArray&)` | `AecDbEwEquipment::FreeSubPrimData()` | 只处理 `m_arSubPrimPtrs`,改成成员函数后参数不再需要 |
| `FreeBuffer(AcDbVoidPtrArray&)` | `static FreeEntityArray()` | 通用实体数组,加 `static` 收回内部链接 |
| `FreeBuffer2(CPtrArray&)` | `static FreeComplexCurveArray()` | `AecComplexCurve` 数组 |
| `FreeBuffer3(CPtrArray&)` | `static FreeFaceplanArray()` | `Aec3dFaceplan` 数组 |
**尚未处理**: **尚未处理**:
- 2.8 的第二个问题(为了算最近点把临时 solid 写进模型空间再 erase),属于副作用与性能,放在第三批 - 2.8 的第二个问题(为了算最近点把临时 solid 写进模型空间再 erase),属于副作用与性能,放在第三批
- `~XPrimData()`(`EarThwormDef.h:2539`)只删 `m_Combins` 里的结构体,不释放它们的 `m_pData`。这条要动公共头文件,且只影响 `kCombination` 单元(存盘时又会被 3.1 清空),单独评估
--- ---
@@ -509,8 +536,8 @@ Draw3dSolid(&dc, nColor); // :3062 拖拽时每帧都走到这里
| # | 改动 | 位置 | 风险 | 状态 | | # | 改动 | 位置 | 风险 | 状态 |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| 1 | 删掉 `dwgInFields` 里的重复分配,`readString` 补 `acutDelString` | `:1707` `:1720` | 低 | 已完成 | | 1 | 删掉 `dwgInFields` 里的重复分配,`readString` 补 `acutDelString` | `:1707` `:1720` | 低 | 已完成 |
| 2 | 析构补 `FreeBuffer(m_arSubPrimPtrs)` | `:1686` | 低(依赖 #3) | 已完成 | | 2 | 析构补 `FreeSubPrimData()` | `:1686` | 低(依赖 #3) | 已完成 |
| 3 | `FreeBuffer(CPtrArray&)` 释放 `m_pData` 后删结构体 | `:1520` | 低 | 已完成(未用 `releaseData`,见 2.3) | | 3 | `releaseData()` 统一 `delete[]`,`FreeSubPrimData()` 释放 `m_pData` 后删结构体 | `:1520` | 低 | 已完成(见 2.3、2.13) |
| 4 | `subDMesh2NewSolid` 按下标倒序删除并释放 | `:3159` | 中(涉及几何正确性,需样例图) | 已完成 | | 4 | `subDMesh2NewSolid` 按下标倒序删除并释放 | `:3159` | 中(涉及几何正确性,需样例图) | 已完成 |
| 5 | `RemoveSubPrimObj*` 补释放 `m_pData` | `:4276` `:4291` | 低 | 已完成 | | 5 | `RemoveSubPrimObj*` 补释放 `m_pData` | `:4276` `:4291` | 低 | 已完成 |
| 6 | `subErase` 的 `Find` 补 `!= -1` | `:2119` | 低(行为会变,需回归删除阀门) | 待做 | | 6 | `subErase` 的 `Find` 补 `!= -1` | `:2119` | 低(行为会变,需回归删除阀门) | 待做 |
@@ -557,7 +584,7 @@ Draw3dSolid(&dc, nColor); // :3062 拖拽时每帧都走到这里
| 改动 | 验证方式 | | 改动 | 验证方式 |
| --- | --- | | --- | --- |
| 夹点数组 / 析构释放 | 打开含 1000+ 设备的图纸,任务管理器看私有字节;关图后应回落 | | 夹点数组 / 析构释放 | 打开含 1000+ 设备的图纸,任务管理器看私有字节;关图后应回落 |
| `FreeBuffer` 释放结构体 | 各类单元(box/cylinder/cone/Revit/组合)各删一个,确认无崩溃 | | `releaseData` 统一 `delete[]` | 各类单元(box/cylinder/cone/Revit/组合)各删一个,确认无崩溃;开图→改参数→存盘→重开,几何完整 |
| 剖切 / 2D 导出 | 对含阀门、法兰、普通设备的图各剖一次,反复开关剖切对话框,内存不持续上涨 | | 剖切 / 2D 导出 | 对含阀门、法兰、普通设备的图各剖一次,反复开关剖切对话框,内存不持续上涨 |
| `subDMesh2NewSolid` | 含 SubDMesh 的样例图,开图后单元数量与类型正确,绘制不缺体 | | `subDMesh2NewSolid` | 含 SubDMesh 的样例图,开图后单元数量与类型正确,绘制不缺体 |
| `subErase` | 删除阀门/接头/普通设备各一次,确认只有阀门走合并管线 | | `subErase` | 删除阀门/接头/普通设备各一次,确认只有阀门走合并管线 |
@@ -169,19 +169,6 @@ namespace
return pData; 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) AecEqui::XPrimData* dwgInFieldsForXPrim(AcDbDwgFiler *pFiler, const Adesk::UInt32 &CurrentVer)
{ {
Adesk::Int16 nType = 0; Adesk::Int16 nType = 0;
@@ -884,7 +871,7 @@ namespace
} }
#pragma region #pragma region
void FreeBuffer2(CPtrArray& arCplptrs) static void FreeComplexCurveArray(CPtrArray& arCplptrs)
{ {
for (int i = 0; i < arCplptrs.GetSize(); i++) for (int i = 0; i < arCplptrs.GetSize(); i++)
{ {
@@ -897,7 +884,7 @@ namespace
arCplptrs.RemoveAll(); arCplptrs.RemoveAll();
} }
void FreeBuffer3(CPtrArray& arCplptrs) static void FreeFaceplanArray(CPtrArray& arCplptrs)
{ {
for (int i = 0; i < arCplptrs.GetSize(); i++) for (int i = 0; i < arCplptrs.GetSize(); i++)
{ {
@@ -1519,7 +1506,7 @@ namespace
return bOk; return bOk;
} }
void FreeBuffer(AcDbVoidPtrArray& arEntPtrs) static void FreeEntityArray(AcDbVoidPtrArray& arEntPtrs)
{ {
AcDbEntity* pEnt = NULL; AcDbEntity* pEnt = NULL;
while (arEntPtrs.length() > 0) 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 void TransformEntity(AcDbEntity *p
, const AcGePoint3d &ptIns , const AcGePoint3d &ptIns
, const AcGeVector3d &vtDir , const AcGeVector3d &vtDir
@@ -1694,7 +1671,7 @@ AecDbEwEquipment::~AecDbEwEquipment(void)
{ {
Clean3DBuffer(); Clean3DBuffer();
Clean2DBuffer(); Clean2DBuffer();
FreeBuffer(m_arSubPrimPtrs); FreeSubPrimData();
delete [] m_pGripAppData; delete [] m_pGripAppData;
} }
@@ -1738,7 +1715,7 @@ Acad::ErrorStatus AecDbEwEquipment::dwgInFields(AcDbDwgFiler* pFiler)
pFiler->readInt32(&nLen); pFiler->readInt32(&nLen);
//重新读入前先释放旧几何,只 RemoveAll 会漏掉结构体和参数块 //重新读入前先释放旧几何,只 RemoveAll 会漏掉结构体和参数块
FreeBuffer(m_arSubPrimPtrs); FreeSubPrimData();
AecEqui::XPrimData* pSolid = NULL; AecEqui::XPrimData* pSolid = NULL;
Adesk::Int16 nType = 0; Adesk::Int16 nType = 0;
@@ -2186,9 +2163,8 @@ Acad::ErrorStatus AecDbEwEquipment::copyFrom(const AcRxObject* pSrc)
AecDbEntityBase::copyFrom(pSrc); AecDbEntityBase::copyFrom(pSrc);
//FreeBufer!!!! //先释放旧几何,否则被覆盖的那批结构体和参数块全部泄漏
FreeBuffer(m_arSubPrimPtrs); FreeSubPrimData();
m_arSubPrimPtrs.RemoveAll();
AecDbEwEquipment* pImp = (AecDbEwEquipment*)pSrc; AecDbEwEquipment* pImp = (AecDbEwEquipment*)pSrc;
if (pImp != NULL) if (pImp != NULL)
@@ -3173,7 +3149,12 @@ void AecDbEwEquipment::subDMesh2NewSolid()
for (int i((int)idxs.size() - 1); i >= 0; --i) for (int i((int)idxs.size() - 1); i >= 0; --i)
{ {
int nIndex = idxs[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); m_arSubPrimPtrs.RemoveAt(nIndex);
} }
@@ -4284,6 +4265,20 @@ void AecDbEwEquipment::AddSubPrimObj(AecEqui::XPrimData* p)
m_arSubPrimPtrs.Add(pData); 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) void AecDbEwEquipment::RemoveSubPrimObj(int nIndex)
{ {
AssertWriteEnabled(); AssertWriteEnabled();
@@ -4293,7 +4288,8 @@ void AecDbEwEquipment::RemoveSubPrimObj(int nIndex)
pSolid = (AecEqui::XPrimData*)m_arSubPrimPtrs.GetAt(nIndex); pSolid = (AecEqui::XPrimData*)m_arSubPrimPtrs.GetAt(nIndex);
m_arSubPrimPtrs.RemoveAt(nIndex); m_arSubPrimPtrs.RemoveAt(nIndex);
m_mapSpecXData.RemoveAt(TypeConvert::i2s(pSolid->m_nID) + _T(":color")); 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_arSubPrimPtrs.RemoveAt(i);
m_mapSpecXData.RemoveAt(TypeConvert::i2s(pSolid->m_nID) + _T(":color")); m_mapSpecXData.RemoveAt(TypeConvert::i2s(pSolid->m_nID) + _T(":color"));
ReleaseXPrimData(pSolid); pSolid->releaseData();
DELETE_PTR(pSolid);
break; break;
} }
} }
@@ -8537,8 +8534,8 @@ void AecDbEwEquipment::PrimPorjectToPlan(AecComplexCurve& cplCurve, AecEqui::XVi
} }
//3.释放内存 //3.释放内存
FreeBuffer2(arPrimCplPtrs); FreeComplexCurveArray(arPrimCplPtrs);
FreeBuffer3(arFaceplanPtrs); 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 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); AecCoverBooleanOper::SortPoints(arPts, pDbCrvDn);
pDbCrvDn->getSplitCurves(arPts, arSegPtrs); pDbCrvDn->getSplitCurves(arPts, arSegPtrs);
AppendSegment(elDn, cplexDn, arSegPtrs, dZ); AppendSegment(elDn, cplexDn, arSegPtrs, dZ);
FreeBuffer(arSegPtrs); FreeEntityArray(arSegPtrs);
} }
else else
{ {
@@ -11375,7 +11372,7 @@ void AecDbEwEquipment::SplitCrvOnIntersect(AecComplexCurve* pCrvDn, AecComplexCu
*pCrvDn = cplexDn; *pCrvDn = cplexDn;
FreeBuffer(arUpCrvPtrs); FreeEntityArray(arUpCrvPtrs);
} }
AcDbCurve* AecDbEwEquipment::CurveElement2DbCurve(AecEqui::AecCurveElement el) const AcDbCurve* AecDbEwEquipment::CurveElement2DbCurve(AecEqui::AecCurveElement el) const
@@ -12662,7 +12659,7 @@ bool AecDbEwEquipment::OldGetSectionDraw(AcGePlane &plan, const AcGeVector3d &vt
} }
} }
//GetDraw3dables 产出的整组克隆,原来从头到尾没释放 //GetDraw3dables 产出的整组克隆,原来从头到尾没释放
FreeBuffer(arSubPtrs); FreeEntityArray(arSubPtrs);
CString sName; CString sName;
m_mapSpecXData.GetAt(KEY_NAME, sName); m_mapSpecXData.GetAt(KEY_NAME, sName);
@@ -12889,7 +12886,7 @@ bool AecDbEwEquipment::ByJson(const SHJson::WValue &v)
if (!it->value.IsArray()) return false; if (!it->value.IsArray()) return false;
//先释放旧几何,否则对已有对象再导入会叠加重复单元 //先释放旧几何,否则对已有对象再导入会叠加重复单元
FreeBuffer(m_arSubPrimPtrs); FreeSubPrimData();
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i) 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)) if (byJson(*i, p))
m_arSubPrimPtrs.Add(p); m_arSubPrimPtrs.Add(p);
else else
ReleaseXPrimData(p); //解析失败,原来既不进数组也不释放 {
//解析失败,原来既不进数组也不释放
p->releaseData();
DELETE_PTR(p);
}
} }
return true; return true;
+1 -1
View File
@@ -57,7 +57,7 @@ namespace
{ {
::Sleep(30); ::Sleep(30);
pXPData->m_nID = ::GetTickCount(); pXPData->m_nID = ::GetTickCount();
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
} }
@@ -6131,7 +6131,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
@@ -321,7 +321,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
+1 -1
View File
@@ -275,7 +275,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
+1 -1
View File
@@ -18667,7 +18667,7 @@ void PL_PARAM_NOZZ()
data.m_nID = ::_time32(NULL); data.m_nID = ::_time32(NULL);
data.m_iClr = 1; data.m_iClr = 1;
data.m_pData = new AecEqui::XNozz; data.m_pData = new unsigned char[sizeof(AecEqui::XNozz)];
::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz)); ::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz));
data.m_nSize = sizeof(AecEqui::XNozz); data.m_nSize = sizeof(AecEqui::XNozz);
data.m_nActiveInf = 0; data.m_nActiveInf = 0;
+1 -1
View File
@@ -27,7 +27,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
+1 -1
View File
@@ -50,7 +50,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
+4 -4
View File
@@ -44,7 +44,7 @@ namespace
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
@@ -673,7 +673,7 @@ CSBZWDlg::CSBZWDlg(CWnd* pParent /*=NULL*/)
m_boxData.m_eType = AecEqui::kBox; m_boxData.m_eType = AecEqui::kBox;
m_boxData.m_nID = ::_time32(NULL); m_boxData.m_nID = ::_time32(NULL);
m_boxData.m_pData = new AecEqui::XBOX; m_boxData.m_pData = new unsigned char[sizeof(AecEqui::XBOX)];
m_boxData.m_iClr = m_clr; m_boxData.m_iClr = m_clr;
AecEqui::XBox box; AecEqui::XBox box;
@@ -716,7 +716,7 @@ CSBZWDlg::CSBZWDlg(double dX, double dY, double dZ, CWnd *pParent /*=NULL*/)
m_boxData.m_eType = AecEqui::kBox; m_boxData.m_eType = AecEqui::kBox;
m_boxData.m_nID = ::_time32(NULL); m_boxData.m_nID = ::_time32(NULL);
m_boxData.m_pData = new AecEqui::XBOX; m_boxData.m_pData = new unsigned char[sizeof(AecEqui::XBOX)];
m_boxData.m_iClr = m_clr; m_boxData.m_iClr = m_clr;
AecEqui::XBox box; AecEqui::XBox box;
@@ -932,7 +932,7 @@ Adesk::Int32 CSBZWDlg::AddNozz(DWORD dwSubiD, AcGeVector3d& vtDir, AcGePoint3d&
data.m_nID = ::_time32(NULL); data.m_nID = ::_time32(NULL);
data.m_iClr = clr; data.m_iClr = clr;
data.m_pData = new AecEqui::XNozz; data.m_pData = new unsigned char[sizeof(AecEqui::XNozz)];
::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz)); ::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz));
data.m_nSize = sizeof(AecEqui::XNozz); data.m_nSize = sizeof(AecEqui::XNozz);
data.m_nActiveInf = -1; data.m_nActiveInf = -1;
+2 -2
View File
@@ -42,7 +42,7 @@ namespace MKValve
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
@@ -1951,7 +1951,7 @@ namespace MKHvacValve
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
+1 -1
View File
@@ -83,7 +83,7 @@ namespace FENGJI
} }
break; break;
default: default:
pXPData->m_pData = new T; pXPData->m_pData = new unsigned char[sizeof(T)];
::memcpy(pXPData->m_pData, pData, sizeof(T)); ::memcpy(pXPData->m_pData, pData, sizeof(T));
pXPData->m_nSize = sizeof(T); pXPData->m_nSize = sizeof(T);
break; break;
@@ -6540,7 +6540,7 @@ void PL_FZGZCmd()
data.m_nID = ::_time32(NULL); data.m_nID = ::_time32(NULL);
data.m_iClr = 1; data.m_iClr = 1;
data.m_pData = new AecEqui::XNozz; data.m_pData = new unsigned char[sizeof(AecEqui::XNozz)];
::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz)); ::memcpy(data.m_pData, pNozzData, sizeof(AecEqui::XNozz));
data.m_nSize = sizeof(AecEqui::XNozz); data.m_nSize = sizeof(AecEqui::XNozz);
data.m_nActiveInf = 0; data.m_nActiveInf = 0;
@@ -360,6 +360,8 @@ public:
void AddSubPrimObj(AecEqui::XPrimData* p); void AddSubPrimObj(AecEqui::XPrimData* p);
void RemoveSubPrimObj(int nIndex); void RemoveSubPrimObj(int nIndex);
void RemoveSubPrimObjByID(int nSubID); void RemoveSubPrimObjByID(int nSubID);
//释放全部几何单元(m_arSubPrimPtrs 里的 XPrimData 及其 m_pData)
void FreeSubPrimData();
void AddTransform(const AcGeMatrix3d& xform); void AddTransform(const AcGeMatrix3d& xform);
void AddTransform(const AcGeVector3d& vtMove); void AddTransform(const AcGeVector3d& vtMove);
+8 -19
View File
@@ -2538,30 +2538,19 @@ namespace AecEqui
} }
~XPrimData() ~XPrimData()
{ {
releaseData();
for (size_t i(0); i < m_Combins.size(); ++i) for (size_t i(0); i < m_Combins.size(); ++i)
DELETE_PTR(m_Combins[i]); DELETE_PTR(m_Combins[i]);
} }
void releaseData() void releaseData()
{ {
if (!m_pData) return; //m_pData 一律用 new unsigned char[] 分配(dwgInFieldsForXPrim、byJson、
switch (m_eType) //copyXPrimData 以及各命令模块的 setData),元素都是 POD,不含析构,
{ //所以释放规则只有一条:delete[]。不要再按 m_eType 区分。
case AecEqui::kNewExtrude: if (m_pData == NULL) return;
case AecEqui::kNewRevolve : delete[] (unsigned char*)m_pData;
case AecEqui::kNewLoft: m_pData = NULL;
case AecEqui::kRevitSweep: m_nSize = 0;
case AecEqui::kNewSweep:
case AecEqui::kRevitCombination:
case AecEqui::kExtrude:
case AecEqui::kRevolve:
delete[] m_pData;
m_nSize = 0;
break;
default:
delete m_pData;
m_nSize = 0;
break;
}
} }
//基本体数据 //基本体数据
short m_eType; //单元体类型 short m_eType; //单元体类型