[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
4c9191d489
commit
e91cc8e329
@@ -344,14 +344,14 @@ CosmeticEdge::CosmeticEdge()
|
||||
{
|
||||
// Base::Console().Message("CE::CE()\n");
|
||||
permaRadius = 0.0;
|
||||
m_geometry = new TechDraw::BaseGeom();
|
||||
m_geometry = std::make_shared<TechDraw::BaseGeom> ();
|
||||
initialize();
|
||||
}
|
||||
|
||||
CosmeticEdge::CosmeticEdge(CosmeticEdge* ce)
|
||||
{
|
||||
// Base::Console().Message("CE::CE(ce)\n");
|
||||
TechDraw::BaseGeom* newGeom = ce->m_geometry->copy();
|
||||
TechDraw::BaseGeomPtr newGeom = ce->m_geometry->copy();
|
||||
//these endpoints are already YInverted
|
||||
permaStart = ce->permaStart;
|
||||
permaEnd = ce->permaEnd;
|
||||
@@ -384,7 +384,7 @@ CosmeticEdge::CosmeticEdge(TopoDS_Edge e)
|
||||
permaEnd = m_geometry->getEndPoint();
|
||||
if ((m_geometry->geomType == TechDraw::GeomType::CIRCLE) ||
|
||||
(m_geometry->geomType == TechDraw::GeomType::ARCOFCIRCLE) ) {
|
||||
TechDraw::Circle* circ = static_cast<TechDraw::Circle*>(m_geometry);
|
||||
TechDraw::CirclePtr circ = std::static_pointer_cast<TechDraw::Circle>(m_geometry);
|
||||
permaStart = circ->center;
|
||||
permaEnd = circ->center;
|
||||
permaRadius = circ->radius;
|
||||
@@ -392,7 +392,7 @@ CosmeticEdge::CosmeticEdge(TopoDS_Edge e)
|
||||
initialize();
|
||||
}
|
||||
|
||||
CosmeticEdge::CosmeticEdge(TechDraw::BaseGeom* g)
|
||||
CosmeticEdge::CosmeticEdge(TechDraw::BaseGeomPtr g)
|
||||
{
|
||||
// Base::Console().Message("CE::CE(bg)\n");
|
||||
m_geometry = g;
|
||||
@@ -400,7 +400,7 @@ CosmeticEdge::CosmeticEdge(TechDraw::BaseGeom* g)
|
||||
permaEnd = m_geometry->getEndPoint();
|
||||
if ((g->geomType == TechDraw::GeomType::CIRCLE) ||
|
||||
(g->geomType == TechDraw::GeomType::ARCOFCIRCLE)) {
|
||||
TechDraw::Circle* circ = static_cast<TechDraw::Circle*>(g);
|
||||
TechDraw::CirclePtr circ = std::static_pointer_cast<TechDraw::Circle>(g);
|
||||
permaStart = circ->center;
|
||||
permaEnd = circ->center;
|
||||
permaRadius = circ->radius;
|
||||
@@ -410,9 +410,7 @@ CosmeticEdge::CosmeticEdge(TechDraw::BaseGeom* g)
|
||||
|
||||
CosmeticEdge::~CosmeticEdge(void)
|
||||
{
|
||||
if (m_geometry != nullptr) {
|
||||
delete m_geometry;
|
||||
}
|
||||
//shared pointer will delete m_geometry when ref count goes to zero.
|
||||
}
|
||||
|
||||
void CosmeticEdge::initialize(void)
|
||||
@@ -426,9 +424,9 @@ void CosmeticEdge::initialize(void)
|
||||
m_geometry->setCosmeticTag(getTagAsString());
|
||||
}
|
||||
|
||||
TechDraw::BaseGeom* CosmeticEdge::scaledGeometry(double scale)
|
||||
TechDraw::BaseGeomPtr CosmeticEdge::scaledGeometry(double scale)
|
||||
{
|
||||
TechDraw::BaseGeom* newGeom = nullptr;
|
||||
TechDraw::BaseGeomPtr newGeom = nullptr;
|
||||
TopoDS_Edge e = m_geometry->occEdge;
|
||||
TopoDS_Shape s = TechDraw::scaleShape(e, scale);
|
||||
TopoDS_Edge newEdge = TopoDS::Edge(s);
|
||||
@@ -477,13 +475,13 @@ void CosmeticEdge::Save(Base::Writer &writer) const
|
||||
|
||||
writer.Stream() << writer.ind() << "<GeometryType value=\"" << m_geometry->geomType <<"\"/>" << endl;
|
||||
if (m_geometry->geomType == TechDraw::GeomType::GENERIC) {
|
||||
Generic* gen = static_cast<Generic*>(m_geometry);
|
||||
GenericPtr gen = std::static_pointer_cast<Generic>(m_geometry);
|
||||
gen->Save(writer);
|
||||
} else if (m_geometry->geomType == TechDraw::GeomType::CIRCLE) {
|
||||
TechDraw::Circle* circ = static_cast<TechDraw::Circle*>(m_geometry);
|
||||
TechDraw::CirclePtr circ = std::static_pointer_cast<TechDraw::Circle>(m_geometry);
|
||||
circ->Save(writer);
|
||||
} else if (m_geometry->geomType == TechDraw::GeomType::ARCOFCIRCLE) {
|
||||
TechDraw::AOC* aoc = static_cast<TechDraw::AOC*>(m_geometry);
|
||||
TechDraw::AOCPtr aoc = std::static_pointer_cast<TechDraw::AOC>(m_geometry);
|
||||
aoc->Save(writer);
|
||||
} else {
|
||||
Base::Console().Warning("CE::Save - unimplemented geomType: %d\n", m_geometry->geomType);
|
||||
@@ -509,25 +507,25 @@ void CosmeticEdge::Restore(Base::XMLReader &reader)
|
||||
TechDraw::GeomType gType = (TechDraw::GeomType)reader.getAttributeAsInteger("value");
|
||||
|
||||
if (gType == TechDraw::GeomType::GENERIC) {
|
||||
TechDraw::Generic* gen = new TechDraw::Generic();
|
||||
TechDraw::GenericPtr gen = std::make_shared<TechDraw::Generic> ();
|
||||
gen->Restore(reader);
|
||||
gen->occEdge = GeometryUtils::edgeFromGeneric(gen);
|
||||
m_geometry = (TechDraw::BaseGeom*) gen;
|
||||
m_geometry = (TechDraw::BaseGeomPtr) gen;
|
||||
permaStart = gen->getStartPoint();
|
||||
permaEnd = gen->getEndPoint();
|
||||
} else if (gType == TechDraw::GeomType::CIRCLE) {
|
||||
TechDraw::Circle* circ = new TechDraw::Circle();
|
||||
TechDraw::CirclePtr circ = std::make_shared<TechDraw::Circle> ();
|
||||
circ->Restore(reader);
|
||||
circ->occEdge = GeometryUtils::edgeFromCircle(circ);
|
||||
m_geometry = (TechDraw::BaseGeom*) circ;
|
||||
m_geometry = (TechDraw::BaseGeomPtr) circ;
|
||||
permaRadius = circ->radius;
|
||||
permaStart = circ->center;
|
||||
permaEnd = circ->center;
|
||||
} else if (gType == TechDraw::GeomType::ARCOFCIRCLE) {
|
||||
TechDraw::AOC* aoc = new TechDraw::AOC();
|
||||
TechDraw::AOCPtr aoc = std::make_shared<TechDraw::AOC> ();
|
||||
aoc->Restore(reader);
|
||||
aoc->occEdge = GeometryUtils::edgeFromCircleArc(aoc);
|
||||
m_geometry = (TechDraw::BaseGeom*) aoc;
|
||||
m_geometry = (TechDraw::BaseGeomPtr) aoc;
|
||||
permaStart = aoc->startPnt;
|
||||
permaEnd = aoc->endPnt;
|
||||
permaRadius = aoc->radius;
|
||||
@@ -574,7 +572,7 @@ CosmeticEdge* CosmeticEdge::copy(void) const
|
||||
{
|
||||
// Base::Console().Message("CE::copy()\n");
|
||||
CosmeticEdge* newCE = new CosmeticEdge();
|
||||
TechDraw::BaseGeom* newGeom = m_geometry->copy();
|
||||
TechDraw::BaseGeomPtr newGeom = m_geometry->copy();
|
||||
newCE->m_geometry = newGeom;
|
||||
newCE->m_format = m_format;
|
||||
return newCE;
|
||||
@@ -614,7 +612,7 @@ CenterLine::CenterLine(void)
|
||||
m_type = CLTYPE::FACE;
|
||||
m_flip2Line = false;
|
||||
|
||||
m_geometry = new TechDraw::BaseGeom();
|
||||
m_geometry = std::make_shared<TechDraw::BaseGeom> ();
|
||||
|
||||
initialize();
|
||||
}
|
||||
@@ -636,7 +634,7 @@ CenterLine::CenterLine(TechDraw::CenterLine* cl)
|
||||
initialize();
|
||||
}
|
||||
|
||||
CenterLine::CenterLine(TechDraw::BaseGeom* bg)
|
||||
CenterLine::CenterLine(TechDraw::BaseGeomPtr bg)
|
||||
{
|
||||
m_start = bg->getStartPoint();
|
||||
m_end = bg->getEndPoint();
|
||||
@@ -774,7 +772,7 @@ CenterLine* CenterLine::CenterLineBuilder(DrawViewPart* partFeat,
|
||||
return cl;
|
||||
}
|
||||
|
||||
TechDraw::BaseGeom* CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat)
|
||||
TechDraw::BaseGeomPtr CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat)
|
||||
{
|
||||
// Base::Console().Message("CL::scaledGeometry() - m_type: %d\n", m_type);
|
||||
double scale = partFeat->getScale();
|
||||
@@ -812,7 +810,7 @@ TechDraw::BaseGeom* CenterLine::scaledGeometry(TechDraw::DrawViewPart* partFeat)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
TechDraw::BaseGeom* newGeom = nullptr;
|
||||
TechDraw::BaseGeomPtr newGeom = nullptr;
|
||||
Base::Vector3d p1 = ends.first;
|
||||
Base::Vector3d p2 = ends.second;
|
||||
if (!p1.IsEqual(p2, 0.00001)) {
|
||||
@@ -896,7 +894,7 @@ std::pair<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints(DrawViewPart
|
||||
continue;
|
||||
}
|
||||
int idx = TechDraw::DrawUtil::getIndexFromName(fn);
|
||||
std::vector<TechDraw::BaseGeom*> faceEdges =
|
||||
std::vector<TechDraw::BaseGeomPtr> faceEdges =
|
||||
partFeat->getFaceEdgesByIndex(idx);
|
||||
if (!faceEdges.empty()) {
|
||||
for (auto& fe: faceEdges) {
|
||||
@@ -1013,15 +1011,15 @@ std::pair<Base::Vector3d, Base::Vector3d> CenterLine::calcEndPoints2Lines(DrawVi
|
||||
}
|
||||
|
||||
double scale = partFeat->getScale();
|
||||
const std::vector<TechDraw::BaseGeom*> dbEdges = partFeat->getEdgeGeometry();
|
||||
const std::vector<TechDraw::BaseGeomPtr> dbEdges = partFeat->getEdgeGeometry();
|
||||
|
||||
std::vector<TechDraw::BaseGeom*> edges;
|
||||
std::vector<TechDraw::BaseGeomPtr> edges;
|
||||
for (auto& en: edgeNames) {
|
||||
if (TechDraw::DrawUtil::getGeomTypeFromName(en) != "Edge") {
|
||||
continue;
|
||||
}
|
||||
int idx = TechDraw::DrawUtil::getIndexFromName(en);
|
||||
TechDraw::BaseGeom* bg = partFeat->getGeomByIndex(idx);
|
||||
TechDraw::BaseGeomPtr bg = partFeat->getGeomByIndex(idx);
|
||||
if (bg != nullptr) {
|
||||
edges.push_back(bg);
|
||||
} else {
|
||||
@@ -1287,13 +1285,13 @@ void CenterLine::Save(Base::Writer &writer) const
|
||||
if (m_geometry != nullptr) {
|
||||
writer.Stream() << writer.ind() << "<GeometryType value=\"" << m_geometry->geomType <<"\"/>" << endl;
|
||||
if (m_geometry->geomType == TechDraw::GeomType::GENERIC) {
|
||||
Generic* gen = static_cast<Generic*>(m_geometry);
|
||||
GenericPtr gen = std::static_pointer_cast<Generic>(m_geometry);
|
||||
gen->Save(writer);
|
||||
} else if (m_geometry->geomType == TechDraw::GeomType::CIRCLE) {
|
||||
TechDraw::Circle* circ = static_cast<TechDraw::Circle*>(m_geometry);
|
||||
TechDraw::CirclePtr circ = std::static_pointer_cast<TechDraw::Circle>(m_geometry);
|
||||
circ->Save(writer);
|
||||
} else if (m_geometry->geomType == TechDraw::GeomType::ARCOFCIRCLE) {
|
||||
TechDraw::AOC* aoc = static_cast<TechDraw::AOC*>(m_geometry);
|
||||
TechDraw::AOCPtr aoc = std::static_pointer_cast<TechDraw::AOC>(m_geometry);
|
||||
aoc->Save(writer);
|
||||
} else {
|
||||
Base::Console().Message("CL::Save - unimplemented geomType: %d\n", m_geometry->geomType);
|
||||
@@ -1385,20 +1383,20 @@ void CenterLine::Restore(Base::XMLReader &reader)
|
||||
reader.readElement("GeometryType");
|
||||
TechDraw::GeomType gType = (TechDraw::GeomType)reader.getAttributeAsInteger("value");
|
||||
if (gType == TechDraw::GeomType::GENERIC) {
|
||||
TechDraw::Generic* gen = new TechDraw::Generic();
|
||||
TechDraw::GenericPtr gen = std::make_shared<TechDraw::Generic> ();
|
||||
gen->Restore(reader);
|
||||
gen->occEdge = GeometryUtils::edgeFromGeneric(gen);
|
||||
m_geometry = (TechDraw::BaseGeom*) gen;
|
||||
m_geometry = gen;
|
||||
} else if (gType == TechDraw::GeomType::CIRCLE) {
|
||||
TechDraw::Circle* circ = new TechDraw::Circle();
|
||||
TechDraw::CirclePtr circ = std::make_shared<TechDraw::Circle> ();
|
||||
circ->Restore(reader);
|
||||
circ->occEdge = GeometryUtils::edgeFromCircle(circ);
|
||||
m_geometry = (TechDraw::BaseGeom*) circ;
|
||||
m_geometry = circ;
|
||||
} else if (gType == TechDraw::GeomType::ARCOFCIRCLE) {
|
||||
TechDraw::AOC* aoc = new TechDraw::AOC();
|
||||
TechDraw::AOCPtr aoc = std::make_shared<TechDraw::AOC> ();
|
||||
aoc->Restore(reader);
|
||||
aoc->occEdge = GeometryUtils::edgeFromCircleArc(aoc);
|
||||
m_geometry = (TechDraw::BaseGeom*) aoc;
|
||||
m_geometry = aoc;
|
||||
} else {
|
||||
Base::Console().Warning("CL::Restore - unimplemented geomType: %d\n", gType);
|
||||
}
|
||||
@@ -1421,7 +1419,7 @@ CenterLine* CenterLine::copy(void) const
|
||||
newCL->m_edges = m_edges;
|
||||
newCL->m_verts = m_verts;
|
||||
|
||||
TechDraw::BaseGeom* newGeom = m_geometry->copy();
|
||||
TechDraw::BaseGeomPtr newGeom = m_geometry->copy();
|
||||
newCL->m_geometry = newGeom;
|
||||
|
||||
newCL->m_format = m_format;
|
||||
|
||||
Reference in New Issue
Block a user