From 4d2cf011c73551bbe67518097063e22ecdac7c7c Mon Sep 17 00:00:00 2001 From: dooglus Date: Sun, 3 Feb 2008 23:11:46 +0000 Subject: [PATCH] Fix the same bug as the last commit, but better. Deleting from a set doesn't invalidate the set iterator *unless the iterator was pointing at the deleted element*. git-svn-id: http://svn.voria.com/code@1571 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/src/synfig/canvas.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/synfig-core/trunk/src/synfig/canvas.cpp b/synfig-core/trunk/src/synfig/canvas.cpp index 8cf1f20..66d3d06 100644 --- a/synfig-core/trunk/src/synfig/canvas.cpp +++ b/synfig-core/trunk/src/synfig/canvas.cpp @@ -90,32 +90,24 @@ Canvas::on_changed() Canvas::~Canvas() { - bool keep_going = true; - // we were having a crash where pastecanvas layers were still // refering to a canvas after it had been destroyed; this code // will stop the pastecanvas layers from refering to the canvas // before the canvas is destroyed // the set_sub_canvas(0) ends up deleting the parent-child link, - // which modifies the set we're iterating through, invalidating - // the set iterator. the outer while loop makes sure that we - // recreate the set iterator each time the set itself is modified - while (keep_going) + // which deletes the current element from the set we're iterating + // through, so we have to make sure we've incremented the iterator + // before we mess with the pastecanvas + std::set::iterator iter = parent_set.begin(); + while (iter != parent_set.end()) { - keep_going = false; // only keep going if we find a pastecanvas parent to clear - for (std::set::iterator iter = parent_set.begin(); iter != parent_set.end(); iter++) - { - Layer_PasteCanvas* paste_canvas = dynamic_cast(*iter); - if(paste_canvas) - { - paste_canvas->set_sub_canvas(0); - keep_going = true; - break; // out of the for loop to the while loop - } - else - warning("destroyed canvas has a parent that is not a pastecanvas - please report if repeatable"); - } + Layer_PasteCanvas* paste_canvas = dynamic_cast(*iter); + iter++; + if(paste_canvas) + paste_canvas->set_sub_canvas(0); + else + warning("destroyed canvas has a parent that is not a pastecanvas - please report if repeatable"); } //if(is_inline() && parent_) assert(0); -- 2.7.4