[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:
committed by
WandererFan
parent
ad2169e5ae
commit
28c5890bc9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user