[TD] avoid memory leaks by using shared_ptr

TD geometry objects are sometimes double deleted.  This
change uses shared_ptr instead of raw pointers to manage
deletions.
This commit is contained in:
Wanderer Fan
2022-01-02 10:12:56 -05:00
committed by WandererFan
parent ad2169e5ae
commit 28c5890bc9
34 changed files with 290 additions and 279 deletions

View File

@@ -193,7 +193,7 @@ Py::String CosmeticEdgePy::getTag(void) const
// py-aware class.
//Py::Object CosmeticEdgePy::getGeometry(void) const
//{
//// TechDraw::BaseGeom* bg = getCosmeticEdgePtr()->m_geometry;
//// TechDraw::BaseGeomPtr bg = getCosmeticEdgePtr()->m_geometry;
// Base::Console().Message("Not implemented yet");
// return Py::asObject(Py_None);
//}
@@ -239,10 +239,10 @@ void CosmeticEdgePy::setStart(Py::Object arg)
gp_Pnt gp1(pNew.x,pNew.y,pNew.z);
gp_Pnt gp2(pEnd.x,pEnd.y,pEnd.z);
TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp1, gp2);
auto oldGeom = getCosmeticEdgePtr()->m_geometry;
// auto oldGeom = getCosmeticEdgePtr()->m_geometry;
getCosmeticEdgePtr()->m_geometry = TechDraw::BaseGeom::baseFactory(e);
getCosmeticEdgePtr()->permaStart = pNew;
delete oldGeom;
// delete oldGeom;
}
Py::Object CosmeticEdgePy::getEnd(void) const
@@ -273,10 +273,10 @@ void CosmeticEdgePy::setEnd(Py::Object arg)
gp_Pnt gp1(pNew.x,pNew.y,pNew.z);
gp_Pnt gp2(pStart.x,pStart.y,pStart.z);
TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp2, gp1);
auto oldGeom = getCosmeticEdgePtr()->m_geometry;
// auto oldGeom = getCosmeticEdgePtr()->m_geometry;
getCosmeticEdgePtr()->m_geometry = TechDraw::BaseGeom::baseFactory(e);
getCosmeticEdgePtr()->permaEnd = pNew;
delete oldGeom;
// delete oldGeom;
}
Py::Object CosmeticEdgePy::getRadius(void) const
@@ -316,9 +316,10 @@ void CosmeticEdgePy::setRadius(Py::Object arg)
}
getCosmeticEdgePtr()->permaRadius = r;
auto oldGeom = getCosmeticEdgePtr()->m_geometry;
getCosmeticEdgePtr()->m_geometry = new TechDraw::Circle(getCosmeticEdgePtr()->permaStart, r);
delete oldGeom;
// auto oldGeom = getCosmeticEdgePtr()->m_geometry;
getCosmeticEdgePtr()->m_geometry =
std::make_shared<TechDraw::Circle> (getCosmeticEdgePtr()->permaStart, r);
// delete oldGeom;
}
Py::Object CosmeticEdgePy::getCenter(void) const
@@ -361,7 +362,7 @@ void CosmeticEdgePy::setCenter(Py::Object arg)
pNew = DrawUtil::invertY(pNew);
auto oldGeom = getCosmeticEdgePtr()->m_geometry;
TechDraw::Circle* oldCircle = dynamic_cast<TechDraw::Circle*>(oldGeom);
TechDraw::CirclePtr oldCircle = std::dynamic_pointer_cast<TechDraw::Circle> (oldGeom);
if (oldCircle == nullptr) {
throw Py::TypeError("Edge geometry is not a circle");
}
@@ -369,8 +370,9 @@ void CosmeticEdgePy::setCenter(Py::Object arg)
getCosmeticEdgePtr()->permaStart = pNew;
getCosmeticEdgePtr()->permaEnd = pNew;
getCosmeticEdgePtr()->permaRadius = oldCircle->radius;
getCosmeticEdgePtr()->m_geometry = new TechDraw::Circle(getCosmeticEdgePtr()->permaStart, oldCircle->radius);
delete oldGeom;
getCosmeticEdgePtr()->m_geometry =
std::make_shared<TechDraw::Circle> (getCosmeticEdgePtr()->permaStart, oldCircle->radius);
// delete oldGeom;
}
PyObject *CosmeticEdgePy::getCustomAttributes(const char* /*attr*/) const