From bf129d3a339699a8798275e8284d67e5d1719974 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 24 Oct 2016 14:35:24 +0200 Subject: [PATCH] fix memory leak in SketchObject::transferConstraints --- src/Mod/Sketcher/App/SketchObject.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 11a10938c..a9ea40133 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -887,6 +887,7 @@ int SketchObject::transferConstraints(int fromGeoId, PointPos fromPosId, int toG { const std::vector &vals = this->Constraints.getValues(); std::vector newVals(vals); + std::vector changed; for (int i=0; i < int(newVals.size()); i++) { if (vals[i]->First == fromGeoId && vals[i]->FirstPos == fromPosId && !(vals[i]->Second == toGeoId && vals[i]->SecondPos == toPosId)) { @@ -894,15 +895,25 @@ int SketchObject::transferConstraints(int fromGeoId, PointPos fromPosId, int toG constNew->First = toGeoId; constNew->FirstPos = toPosId; newVals[i] = constNew; - } else if (vals[i]->Second == fromGeoId && vals[i]->SecondPos == fromPosId && - !(vals[i]->First == toGeoId && vals[i]->FirstPos == toPosId)) { + changed.push_back(constNew); + } + else if (vals[i]->Second == fromGeoId && vals[i]->SecondPos == fromPosId && + !(vals[i]->First == toGeoId && vals[i]->FirstPos == toPosId)) { Constraint *constNew = newVals[i]->clone(); constNew->Second = toGeoId; constNew->SecondPos = toPosId; newVals[i] = constNew; + changed.push_back(constNew); } } - this->Constraints.setValues(newVals); + + // assign the new values only if something has changed + if (!changed.empty()) { + this->Constraints.setValues(newVals); + // free memory + for (Constraint* it : changed) + delete it; + } return 0; }