From Stephan Huber, "attached you'll find a bugfix for removeTransformUpdating and another

similar remove-method.

The old code removed an element from a vector, which invalidates the
iterator of the loop This resulted in a crash on certain platforms. Now
the erasing is done the right way without invalidating the iterator."
This commit is contained in:
Robert Osfield
2009-11-19 17:42:25 +00:00
parent 5a0186555b
commit 22527f6fd3

View File

@@ -182,12 +182,15 @@ void Dragger::removeConstraint(Constraint* constraint)
{ {
for(Constraints::iterator itr = _constraints.begin(); for(Constraints::iterator itr = _constraints.begin();
itr != _constraints.end(); itr != _constraints.end();
++itr) )
{ {
if (*itr = constraint) if (*itr = constraint)
{ {
_constraints.erase(itr); itr = _constraints.erase(itr);
return; return;
} else
{
++itr;
} }
} }
} }
@@ -201,13 +204,17 @@ void Dragger::removeTransformUpdating(osg::MatrixTransform* transform)
{ {
for(Dragger::DraggerCallbacks::iterator itr = _draggerCallbacks.begin(); for(Dragger::DraggerCallbacks::iterator itr = _draggerCallbacks.begin();
itr != _draggerCallbacks.end(); itr != _draggerCallbacks.end();
++itr) )
{ {
DraggerCallback* dc = itr->get(); DraggerCallback* dc = itr->get();
DraggerTransformCallback* dtc = dynamic_cast<DraggerTransformCallback*>(dc); DraggerTransformCallback* dtc = dynamic_cast<DraggerTransformCallback*>(dc);
if (dtc && dtc->getTransform()==transform) if (dtc && dtc->getTransform()==transform)
{ {
_draggerCallbacks.erase(itr); itr = _draggerCallbacks.erase(itr);
}
else
{
++itr;
} }
} }