From 2c8f78b299698bce0e5ff739c06e171991165246 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 29 Aug 2020 23:56:12 +0200 Subject: [PATCH] Part: [skip ci] return std::unique_ptr from Part::makeFromSurface() to avoid memory leaks --- src/Mod/Part/App/Geometry.cpp | 36 ++++++++++++++----------- src/Mod/Part/App/Geometry.h | 3 ++- src/Mod/Part/App/TopoShapeEdgePyImp.cpp | 6 ++--- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/Mod/Part/App/Geometry.cpp b/src/Mod/Part/App/Geometry.cpp index 5b0dff299d..e7663fdf2e 100644 --- a/src/Mod/Part/App/Geometry.cpp +++ b/src/Mod/Part/App/Geometry.cpp @@ -4839,60 +4839,64 @@ GeomArcOfCircle *createFilletGeometry(const GeomLineSegment *lineSeg1, const Geo return arc; } -GeomSurface* makeFromSurface(const Handle(Geom_Surface)& s) +std::unique_ptr makeFromSurface(const Handle(Geom_Surface)& s) { + std::unique_ptr geoSurf; if (s->IsKind(STANDARD_TYPE(Geom_ToroidalSurface))) { Handle(Geom_ToroidalSurface) hSurf = Handle(Geom_ToroidalSurface)::DownCast(s); - return new GeomToroid(hSurf); + geoSurf.reset(new GeomToroid(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_BezierSurface))) { Handle(Geom_BezierSurface) hSurf = Handle(Geom_BezierSurface)::DownCast(s); - return new GeomBezierSurface(hSurf); + geoSurf.reset(new GeomBezierSurface(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_BSplineSurface))) { Handle(Geom_BSplineSurface) hSurf = Handle(Geom_BSplineSurface)::DownCast(s); - return new GeomBSplineSurface(hSurf); + geoSurf.reset(new GeomBSplineSurface(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))) { Handle(Geom_CylindricalSurface) hSurf = Handle(Geom_CylindricalSurface)::DownCast(s); - return new GeomCylinder(hSurf); + geoSurf.reset(new GeomCylinder(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_ConicalSurface))) { Handle(Geom_ConicalSurface) hSurf = Handle(Geom_ConicalSurface)::DownCast(s); - return new GeomCone(hSurf); + geoSurf.reset(new GeomCone(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_SphericalSurface))) { Handle(Geom_SphericalSurface) hSurf = Handle(Geom_SphericalSurface)::DownCast(s); - return new GeomSphere(hSurf); + geoSurf.reset(new GeomSphere(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_Plane))) { Handle(Geom_Plane) hSurf = Handle(Geom_Plane)::DownCast(s); - return new GeomPlane(hSurf); + geoSurf.reset(new GeomPlane(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_OffsetSurface))) { Handle(Geom_OffsetSurface) hSurf = Handle(Geom_OffsetSurface)::DownCast(s); - return new GeomOffsetSurface(hSurf); + geoSurf.reset(new GeomOffsetSurface(hSurf)); } else if (s->IsKind(STANDARD_TYPE(GeomPlate_Surface))) { Handle(GeomPlate_Surface) hSurf = Handle(GeomPlate_Surface)::DownCast(s); - return new GeomPlateSurface(hSurf); + geoSurf.reset(new GeomPlateSurface(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { Handle(Geom_RectangularTrimmedSurface) hSurf = Handle(Geom_RectangularTrimmedSurface)::DownCast(s); - return new GeomTrimmedSurface(hSurf); + geoSurf.reset(new GeomTrimmedSurface(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_SurfaceOfRevolution))) { Handle(Geom_SurfaceOfRevolution) hSurf = Handle(Geom_SurfaceOfRevolution)::DownCast(s); - return new GeomSurfaceOfRevolution(hSurf); + geoSurf.reset(new GeomSurfaceOfRevolution(hSurf)); } else if (s->IsKind(STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion))) { Handle(Geom_SurfaceOfLinearExtrusion) hSurf = Handle(Geom_SurfaceOfLinearExtrusion)::DownCast(s); - return new GeomSurfaceOfExtrusion(hSurf); + geoSurf.reset(new GeomSurfaceOfExtrusion(hSurf)); + } + else { + std::string err = "Unhandled surface type "; + err += s->DynamicType()->Name(); + throw Base::TypeError(err); } - std::string err = "Unhandled surface type "; - err += s->DynamicType()->Name(); - throw Base::TypeError(err); + return geoSurf; } } diff --git a/src/Mod/Part/App/Geometry.h b/src/Mod/Part/App/Geometry.h index 44c0a8418a..37afe1b3b6 100644 --- a/src/Mod/Part/App/Geometry.h +++ b/src/Mod/Part/App/Geometry.h @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -1079,7 +1080,7 @@ PartExport GeomArcOfCircle *createFilletGeometry(const GeomLineSegment *lineSeg1, const GeomLineSegment *lineSeg2, const Base::Vector3d ¢er, double radius); PartExport -GeomSurface *makeFromSurface(const Handle(Geom_Surface)&); +std::unique_ptr makeFromSurface(const Handle(Geom_Surface)&); } #endif // PART_GEOMETRY_H diff --git a/src/Mod/Part/App/TopoShapeEdgePyImp.cpp b/src/Mod/Part/App/TopoShapeEdgePyImp.cpp index 2f3c6723b4..2cf157cbcd 100644 --- a/src/Mod/Part/App/TopoShapeEdgePyImp.cpp +++ b/src/Mod/Part/App/TopoShapeEdgePyImp.cpp @@ -1065,10 +1065,10 @@ PyObject* TopoShapeEdgePy::curveOnSurface(PyObject *args) BRep_Tool::CurveOnSurface(edge, curve, surf, loc, first, last, idx+1); if (curve.IsNull()) Py_Return; - std::unique_ptr geo2d = getCurve2dFromGeom2d(curve); + std::unique_ptr geo2d(getCurve2dFromGeom2d(curve)); if (!geo2d) Py_Return; - Part::GeomSurface* geosurf = makeFromSurface(surf); + std::unique_ptr geosurf(makeFromSurface(surf)); if (!geosurf) Py_Return; @@ -1083,7 +1083,7 @@ PyObject* TopoShapeEdgePy::curveOnSurface(PyObject *args) Py::Tuple tuple(5); tuple.setItem(0, Py::asObject(geo2d->getPyObject())); tuple.setItem(1, Py::asObject(geosurf->getPyObject())); - tuple.setItem(2, Py::Object(new Base::PlacementPy(placement), true)); + tuple.setItem(2, Py::asObject(new Base::PlacementPy(placement))); tuple.setItem(3, Py::Float(first)); tuple.setItem(4, Py::Float(last)); return Py::new_reference_to(tuple);