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
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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; //单元体类型
|
||||||
|
|||||||
Reference in new issue
Block a user