From 41397130e26c9116b48b51728c9edab73577be59 Mon Sep 17 00:00:00 2001 From: company-desktop-computer Date: Fri, 23 Oct 2026 10:29:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=BB=9F=E4=B8=80=20XPrimData::m?= =?UTF-8?q?=5FpData=20=E4=B8=BA=E5=AD=97=E8=8A=82=E6=95=B0=E7=BB=84?= =?UTF-8?q?=EF=BC=8CreleaseData=20=E5=8F=AA=E4=BF=9D=E7=95=99=20delete[]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit releaseData() 原来按 m_eType 分两路(8 种 delete[],其余 delete),但同一类型 在内存里可能是对象也可能是字节数组:开图、JSON 导入、深拷贝都分配 new byte[], 而对话框里 setData 的 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 --- AecDbEwEquipment-analysis.md | 55 ++++++++---- .../Code2026/CoreLibrary/AecDbEwEquipment.cpp | 83 ++++++++++--------- SourceCode/Code2026/ElecCmd/BDQGDlg.cpp | 2 +- .../Code2026/ElecCmd/ElecCmdCommand.cpp | 2 +- .../Code2026/PipelineCmd/EquipmentMakeDlg.cpp | 2 +- SourceCode/Code2026/PipelineCmd/YMJCDlg.cpp | 2 +- SourceCode/Code2026/PipelineCmd/command.cpp | 2 +- SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp | 2 +- SourceCode/Code2026/PlumbingCmd/command.cpp | 2 +- SourceCode/Code2026/Pool3dCmd/SBZWDlg.cpp | 8 +- SourceCode/Code2026/Pool3dCmd/makeValve.cpp | 4 +- SourceCode/Code2026/Pool3dCmd/makefengji.cpp | 2 +- .../Code2026/Pool3dCmd/pool3dcmdCmd.cpp | 2 +- SourceCode/Code2026/inc/AecDbEwEquipment.h | 2 + SourceCode/Code2026/inc/EarThwormDef.h | 27 ++---- 15 files changed, 108 insertions(+), 89 deletions(-) diff --git a/AecDbEwEquipment-analysis.md b/AecDbEwEquipment-analysis.md index ffa7c19..1d74944 100644 --- a/AecDbEwEquipment-analysis.md +++ b/AecDbEwEquipment-analysis.md @@ -89,7 +89,7 @@ AecDbEwEquipment::~AecDbEwEquipment(void) // :1686 同类 `AecDbEwFitting` 的析构(`:584`)同样没处理它的子单元数组,属于同一批遗留写法。 -**修复**:析构里补 `FreeBuffer(m_arSubPrimPtrs);`(该函数已存在,见 2.3,需先修 2.3)。 +**修复**:析构里补 `FreeSubPrimData();`(成员函数,见 2.3 与 2.13)。 ### 2.3 P0:`FreeBuffer(CPtrArray&)` 只释放数据块,不释放结构体 @@ -109,9 +109,28 @@ void FreeBuffer(CPtrArray& arSubPrimPtrs) // :1520 被 `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`(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()` 删错元素,且泄漏 @@ -219,23 +238,31 @@ delete pEnt; // :4049 只删了 exp | # | 实际改法 | 与原方案的差异 | | --- | --- | --- | | 1 | 删掉 `dwgInFields` 里的 `new AecGripData[GRIP_MAXNUM]`;`readString` 后补 `acutDelString(pszTmp)` | 同原方案 | -| 2 | 析构补 `FreeBuffer(m_arSubPrimPtrs)` | 同原方案 | -| 3 | 新增 `ReleaseXPrimData()`(匿名 namespace),`FreeBuffer(CPtrArray&)` 改为调用它 | 没用 `releaseData()`,原因见 2.3 | -| 4 | `subDMesh2NewSolid()` 按 `idxs` 倒序 `ReleaseXPrimData` + `RemoveAt` | 同原方案,另把 `size_t i` 改成 `int i` 倒序 | -| 5 | `RemoveSubPrimObj` / `RemoveSubPrimObjByID` 改用 `ReleaseXPrimData` | 同原方案 | +| 2 | 析构补 `FreeSubPrimData()` | 同原方案 | +| 3 | `FreeSubPrimData()` 成员函数:逐个 `releaseData()` + `DELETE_PTR`,最后 `RemoveAll` | 见 2.3,先统一了 `m_pData` 表示 | +| 4 | `subDMesh2NewSolid()` 按 `idxs` 倒序释放 + `RemoveAt` | 同原方案,另把 `size_t i` 改成 `int i` 倒序 | +| 5 | `RemoveSubPrimObj` / `RemoveSubPrimObjByID` 改用 `releaseData()` + `DELETE_PTR` | 同原方案 | | 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` | 同原方案 | | 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` | 同原方案 | -| 12 | `dwgInFields` 的 `m_arSubPrimPtrs.RemoveAll()` 改为 `FreeBuffer` | 新增,原注释写着 FreeBufer 但没真释放 | +| 12 | `dwgInFields` 的 `m_arSubPrimPtrs.RemoveAll()` 改为 `FreeSubPrimData()` | 新增,原注释写着 FreeBufer 但没真释放 | | 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),属于副作用与性能,放在第三批 -- `~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` | 低 | 已完成 | -| 2 | 析构补 `FreeBuffer(m_arSubPrimPtrs)` | `:1686` | 低(依赖 #3) | 已完成 | -| 3 | `FreeBuffer(CPtrArray&)` 释放 `m_pData` 后删结构体 | `:1520` | 低 | 已完成(未用 `releaseData`,见 2.3) | +| 2 | 析构补 `FreeSubPrimData()` | `:1686` | 低(依赖 #3) | 已完成 | +| 3 | `releaseData()` 统一 `delete[]`,`FreeSubPrimData()` 释放 `m_pData` 后删结构体 | `:1520` | 低 | 已完成(见 2.3、2.13) | | 4 | `subDMesh2NewSolid` 按下标倒序删除并释放 | `:3159` | 中(涉及几何正确性,需样例图) | 已完成 | | 5 | `RemoveSubPrimObj*` 补释放 `m_pData` | `:4276` `:4291` | 低 | 已完成 | | 6 | `subErase` 的 `Find` 补 `!= -1` | `:2119` | 低(行为会变,需回归删除阀门) | 待做 | @@ -557,7 +584,7 @@ Draw3dSolid(&dc, nColor); // :3062 拖拽时每帧都走到这里 | 改动 | 验证方式 | | --- | --- | | 夹点数组 / 析构释放 | 打开含 1000+ 设备的图纸,任务管理器看私有字节;关图后应回落 | -| `FreeBuffer` 释放结构体 | 各类单元(box/cylinder/cone/Revit/组合)各删一个,确认无崩溃 | +| `releaseData` 统一 `delete[]` | 各类单元(box/cylinder/cone/Revit/组合)各删一个,确认无崩溃;开图→改参数→存盘→重开,几何完整 | | 剖切 / 2D 导出 | 对含阀门、法兰、普通设备的图各剖一次,反复开关剖切对话框,内存不持续上涨 | | `subDMesh2NewSolid` | 含 SubDMesh 的样例图,开图后单元数量与类型正确,绘制不缺体 | | `subErase` | 删除阀门/接头/普通设备各一次,确认只有阀门走合并管线 | diff --git a/SourceCode/Code2026/CoreLibrary/AecDbEwEquipment.cpp b/SourceCode/Code2026/CoreLibrary/AecDbEwEquipment.cpp index 01c2436..ad15060 100644 --- a/SourceCode/Code2026/CoreLibrary/AecDbEwEquipment.cpp +++ b/SourceCode/Code2026/CoreLibrary/AecDbEwEquipment.cpp @@ -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; diff --git a/SourceCode/Code2026/ElecCmd/BDQGDlg.cpp b/SourceCode/Code2026/ElecCmd/BDQGDlg.cpp index c809366..ac52200 100644 --- a/SourceCode/Code2026/ElecCmd/BDQGDlg.cpp +++ b/SourceCode/Code2026/ElecCmd/BDQGDlg.cpp @@ -57,7 +57,7 @@ namespace { ::Sleep(30); pXPData->m_nID = ::GetTickCount(); - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); } diff --git a/SourceCode/Code2026/ElecCmd/ElecCmdCommand.cpp b/SourceCode/Code2026/ElecCmd/ElecCmdCommand.cpp index 69acbc9..23e4bd5 100644 --- a/SourceCode/Code2026/ElecCmd/ElecCmdCommand.cpp +++ b/SourceCode/Code2026/ElecCmd/ElecCmdCommand.cpp @@ -6131,7 +6131,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/PipelineCmd/EquipmentMakeDlg.cpp b/SourceCode/Code2026/PipelineCmd/EquipmentMakeDlg.cpp index 01b5e5e..055a6da 100644 --- a/SourceCode/Code2026/PipelineCmd/EquipmentMakeDlg.cpp +++ b/SourceCode/Code2026/PipelineCmd/EquipmentMakeDlg.cpp @@ -321,7 +321,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/PipelineCmd/YMJCDlg.cpp b/SourceCode/Code2026/PipelineCmd/YMJCDlg.cpp index 88135be..176380f 100644 --- a/SourceCode/Code2026/PipelineCmd/YMJCDlg.cpp +++ b/SourceCode/Code2026/PipelineCmd/YMJCDlg.cpp @@ -275,7 +275,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/PipelineCmd/command.cpp b/SourceCode/Code2026/PipelineCmd/command.cpp index b858087..1fd98a7 100644 --- a/SourceCode/Code2026/PipelineCmd/command.cpp +++ b/SourceCode/Code2026/PipelineCmd/command.cpp @@ -18667,7 +18667,7 @@ void PL_PARAM_NOZZ() data.m_nID = ::_time32(NULL); 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)); data.m_nSize = sizeof(AecEqui::XNozz); data.m_nActiveInf = 0; diff --git a/SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp b/SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp index a18dd5d..a5aaa3f 100644 --- a/SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp +++ b/SourceCode/Code2026/PlumbingCmd/CSXHDlg.cpp @@ -27,7 +27,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/PlumbingCmd/command.cpp b/SourceCode/Code2026/PlumbingCmd/command.cpp index 646fbc7..2186a85 100644 --- a/SourceCode/Code2026/PlumbingCmd/command.cpp +++ b/SourceCode/Code2026/PlumbingCmd/command.cpp @@ -50,7 +50,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/Pool3dCmd/SBZWDlg.cpp b/SourceCode/Code2026/Pool3dCmd/SBZWDlg.cpp index cceccd0..218c1d0 100644 --- a/SourceCode/Code2026/Pool3dCmd/SBZWDlg.cpp +++ b/SourceCode/Code2026/Pool3dCmd/SBZWDlg.cpp @@ -44,7 +44,7 @@ namespace } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; @@ -673,7 +673,7 @@ CSBZWDlg::CSBZWDlg(CWnd* pParent /*=NULL*/) m_boxData.m_eType = AecEqui::kBox; 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; 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_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; AecEqui::XBox box; @@ -932,7 +932,7 @@ Adesk::Int32 CSBZWDlg::AddNozz(DWORD dwSubiD, AcGeVector3d& vtDir, AcGePoint3d& data.m_nID = ::_time32(NULL); 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)); data.m_nSize = sizeof(AecEqui::XNozz); data.m_nActiveInf = -1; diff --git a/SourceCode/Code2026/Pool3dCmd/makeValve.cpp b/SourceCode/Code2026/Pool3dCmd/makeValve.cpp index d270b60..6fe55ec 100644 --- a/SourceCode/Code2026/Pool3dCmd/makeValve.cpp +++ b/SourceCode/Code2026/Pool3dCmd/makeValve.cpp @@ -42,7 +42,7 @@ namespace MKValve } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; @@ -1951,7 +1951,7 @@ namespace MKHvacValve } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/Pool3dCmd/makefengji.cpp b/SourceCode/Code2026/Pool3dCmd/makefengji.cpp index a60b2b6..8a1916e 100644 --- a/SourceCode/Code2026/Pool3dCmd/makefengji.cpp +++ b/SourceCode/Code2026/Pool3dCmd/makefengji.cpp @@ -83,7 +83,7 @@ namespace FENGJI } break; default: - pXPData->m_pData = new T; + pXPData->m_pData = new unsigned char[sizeof(T)]; ::memcpy(pXPData->m_pData, pData, sizeof(T)); pXPData->m_nSize = sizeof(T); break; diff --git a/SourceCode/Code2026/Pool3dCmd/pool3dcmdCmd.cpp b/SourceCode/Code2026/Pool3dCmd/pool3dcmdCmd.cpp index 39df404..164b1a5 100644 --- a/SourceCode/Code2026/Pool3dCmd/pool3dcmdCmd.cpp +++ b/SourceCode/Code2026/Pool3dCmd/pool3dcmdCmd.cpp @@ -6540,7 +6540,7 @@ void PL_FZGZCmd() data.m_nID = ::_time32(NULL); 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)); data.m_nSize = sizeof(AecEqui::XNozz); data.m_nActiveInf = 0; diff --git a/SourceCode/Code2026/inc/AecDbEwEquipment.h b/SourceCode/Code2026/inc/AecDbEwEquipment.h index 42944d6..9590942 100644 --- a/SourceCode/Code2026/inc/AecDbEwEquipment.h +++ b/SourceCode/Code2026/inc/AecDbEwEquipment.h @@ -360,6 +360,8 @@ public: void AddSubPrimObj(AecEqui::XPrimData* p); void RemoveSubPrimObj(int nIndex); void RemoveSubPrimObjByID(int nSubID); + //释放全部几何单元(m_arSubPrimPtrs 里的 XPrimData 及其 m_pData) + void FreeSubPrimData(); void AddTransform(const AcGeMatrix3d& xform); void AddTransform(const AcGeVector3d& vtMove); diff --git a/SourceCode/Code2026/inc/EarThwormDef.h b/SourceCode/Code2026/inc/EarThwormDef.h index 6877302..2da8cf6 100644 --- a/SourceCode/Code2026/inc/EarThwormDef.h +++ b/SourceCode/Code2026/inc/EarThwormDef.h @@ -2538,30 +2538,19 @@ namespace AecEqui } ~XPrimData() { + releaseData(); for (size_t i(0); i < m_Combins.size(); ++i) DELETE_PTR(m_Combins[i]); } void releaseData() { - if (!m_pData) return; - switch (m_eType) - { - case AecEqui::kNewExtrude: - case AecEqui::kNewRevolve : - case AecEqui::kNewLoft: - case AecEqui::kRevitSweep: - 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; - } + //m_pData 一律用 new unsigned char[] 分配(dwgInFieldsForXPrim、byJson、 + //copyXPrimData 以及各命令模块的 setData),元素都是 POD,不含析构, + //所以释放规则只有一条:delete[]。不要再按 m_eType 区分。 + if (m_pData == NULL) return; + delete[] (unsigned char*)m_pData; + m_pData = NULL; + m_nSize = 0; } //基本体数据 short m_eType; //单元体类型