From 1df171e36b56c61745939748dfa84810367b39a3 Mon Sep 17 00:00:00 2001 From: a/ Date: Mon, 28 Jun 2021 17:54:42 +0900 Subject: [PATCH] SAGA2: Delete timers on list removal --- engines/saga2/objects.cpp | 2 ++ engines/saga2/timers.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) 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();