diff --git a/engines/saga2/objects.cpp b/engines/saga2/objects.cpp index 4e142278739..5bc7fb4789b 100644 --- a/engines/saga2/objects.cpp +++ b/engines/saga2/objects.cpp @@ -1803,6 +1803,7 @@ bool GameObject::addTimer(TimerID id, int16 frameInterval) { assert((*it)->getObject() == this); if (newTimer->thisID() == (*it)->thisID()) { + delete *it; timerList->_timers.erase(it); break; @@ -1825,6 +1826,7 @@ void GameObject::removeTimer(TimerID id) { if ((timerList = fetchTimerList(this)) != nullptr) { for (Common::List::iterator it = timerList->_timers.begin(); it != timerList->_timers.end(); ++it) { if ((*it)->thisID() == id) { + delete *it; timerList->_timers.erase(it); if (timerList->_timers.empty()) diff --git a/engines/saga2/timers.cpp b/engines/saga2/timers.cpp index 3cb25d18465..7ef797b83ea 100644 --- a/engines/saga2/timers.cpp +++ b/engines/saga2/timers.cpp @@ -111,7 +111,11 @@ TimerList *fetchTimerList(GameObject *obj) { //---------------------------------------------------------------------- // Check all active Timers void checkTimers(void) { - for (Common::List::iterator it = g_vm->_timers.begin(); it != g_vm->_timers.end(); ++it) { + Common::List::iterator nextIt; + + for (Common::List::iterator it = g_vm->_timers.begin(); it != g_vm->_timers.end(); it = nextIt) { + nextIt = it; + nextIt++; if ((*it)->check()) { debugC(2, kDebugTimers, "Timer tick for %p (%s): %p (duration %d)", (void *)(*it)->getObject(), (*it)->getObject()->objName(), (void *)(*it), (*it)->getInterval()); (*it)->reset();