Fix: memory leak in ExPolygon::triangulate_p2t

This commit is contained in:
ntfshard 2015-08-01 14:53:21 +03:00 committed by Alessandro Ranellucci
parent c6ef26a457
commit dbcd1e2df6

View File

@ -375,31 +375,29 @@ ExPolygon::triangulate_p2t(Polygons* polygons) const
simplify_polygons(*this, &expp, true); simplify_polygons(*this, &expp, true);
for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex) { for (ExPolygons::const_iterator ex = expp.begin(); ex != expp.end(); ++ex) {
p2t::CDT* cdt;
// TODO: prevent duplicate points // TODO: prevent duplicate points
// contour // contour
{ std::vector<p2t::Point*> ContourPoints;
std::vector<p2t::Point*> points; for (Points::const_iterator point = ex->contour.points.begin(); point != ex->contour.points.end(); ++point) {
for (Points::const_iterator point = ex->contour.points.begin(); point != ex->contour.points.end(); ++point) { // We should delete each p2t::Point object
points.push_back(new p2t::Point(point->x, point->y)); ContourPoints.push_back(new p2t::Point(point->x, point->y));
}
cdt = new p2t::CDT(points);
} }
p2t::CDT cdt(ContourPoints);
// holes // holes
for (Polygons::const_iterator hole = ex->holes.begin(); hole != ex->holes.end(); ++hole) { for (Polygons::const_iterator hole = ex->holes.begin(); hole != ex->holes.end(); ++hole) {
std::vector<p2t::Point*> points; std::vector<p2t::Point*> points;
for (Points::const_iterator point = hole->points.begin(); point != hole->points.end(); ++point) { for (Points::const_iterator point = hole->points.begin(); point != hole->points.end(); ++point) {
// will be destructed in SweepContext::~SweepContext
points.push_back(new p2t::Point(point->x, point->y)); points.push_back(new p2t::Point(point->x, point->y));
} }
cdt->AddHole(points); cdt.AddHole(points);
} }
// perform triangulation // perform triangulation
cdt->Triangulate(); cdt.Triangulate();
std::vector<p2t::Triangle*> triangles = cdt->GetTriangles(); std::vector<p2t::Triangle*> triangles = cdt.GetTriangles();
for (std::vector<p2t::Triangle*>::const_iterator triangle = triangles.begin(); triangle != triangles.end(); ++triangle) { for (std::vector<p2t::Triangle*>::const_iterator triangle = triangles.begin(); triangle != triangles.end(); ++triangle) {
Polygon p; Polygon p;
@ -409,6 +407,10 @@ ExPolygon::triangulate_p2t(Polygons* polygons) const
} }
polygons->push_back(p); polygons->push_back(p);
} }
for(std::vector<p2t::Point*>::iterator it = ContourPoints.begin(); it != ContourPoints.end(); ++it) {
delete *it;
}
} }
} }