Added ClearModes() method to trackball to avoid leaking and corruptions due to double deletion of modes.
This commit is contained in:
parent
b22077f200
commit
0c5aefb278
|
@ -264,13 +264,7 @@ void ActiveCoordinateFrame::Update()
|
|||
y_axis=r.Rotate(Point3f(0,1,0));
|
||||
z_axis=r.Rotate(Point3f(0,0,1));
|
||||
|
||||
std::map<int, TrackMode *>::iterator it;
|
||||
for(it = manipulator->modes.begin(); it != manipulator->modes.end(); it++)
|
||||
{
|
||||
if ((*it).second)
|
||||
delete (*it).second;
|
||||
}
|
||||
manipulator->modes.clear();
|
||||
manipulator->ClearModes();
|
||||
manipulator->modes[0] = NULL;
|
||||
manipulator->modes[movx] = new AxisMode(p,x_axis);
|
||||
manipulator->modes[movy] = new AxisMode(p,y_axis);
|
||||
|
|
|
@ -131,6 +131,12 @@ Trackball::Trackball(): current_button(0), current_mode(NULL), inactive_mode(NUL
|
|||
}
|
||||
|
||||
Trackball::~Trackball()
|
||||
{
|
||||
ClearModes();
|
||||
delete inactive_mode;
|
||||
}
|
||||
|
||||
void Trackball::ClearModes()
|
||||
{
|
||||
// Note: people ofter maps different keys to the same modes.
|
||||
// so we should avoid double deletion of these double referenced modes.
|
||||
|
@ -140,17 +146,17 @@ Trackball::~Trackball()
|
|||
if ((*it).second) goodModes.insert( (*it).second);
|
||||
|
||||
std::set<TrackMode *>::iterator its;
|
||||
for(its = goodModes.begin(); its != goodModes.end(); its++)
|
||||
for(its = goodModes.begin(); its != goodModes.end(); its++)
|
||||
delete *its;
|
||||
delete inactive_mode;
|
||||
|
||||
modes.clear();
|
||||
}
|
||||
|
||||
|
||||
void Trackball::setDefaultMapping () {
|
||||
idle_and_keys_mode = NULL;
|
||||
|
||||
inactive_mode = new InactiveMode ();
|
||||
modes.clear ();
|
||||
ClearModes();
|
||||
modes[0] = NULL;
|
||||
|
||||
modes[BUTTON_MIDDLE | KEY_ALT] =
|
||||
|
|
|
@ -285,6 +285,11 @@ public:
|
|||
*/
|
||||
void Reset();
|
||||
|
||||
/*!
|
||||
@brief clear the modes map. Taking the right care of not doubledeleting anything.
|
||||
*/
|
||||
void ClearModes();
|
||||
|
||||
// DrawCircle (), DrawPlane(), DrawPlaneHandle() has been moved to trackutils.h
|
||||
// the drawing code has been moved to the trackmodes
|
||||
// void DrawCircle ();
|
||||
|
|
Loading…
Reference in New Issue