From e19173ff733031c753e881df5e268c60a302ce79 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 8 Nov 2015 12:12:17 +0100 Subject: [PATCH] corrected deallocation of messages stored by key only --- src/lib/ebus/message.cpp | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index 694c5f88..32dbfb8b 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -1205,14 +1205,35 @@ void MessageMap::clear() m_pollMessages.top(); m_pollMessages.pop(); } - // free message instances - for (map >::iterator mit = m_messagesByName.begin(); mit != m_messagesByName.end(); mit++) { - if (mit->first[0] != '-') { // avoid double free: instances stored multiple times have a key starting with "-" - vector messages = mit->second; - for (vector::iterator it = messages.begin(); it != messages.end(); it++) - delete *it; - messages.clear(); + // free message instances by name + for (map >::iterator it = m_messagesByName.begin(); it != m_messagesByName.end(); it++) { + vector nameMessages = it->second; + if (it->first[0] != '-') { // avoid double free: instances stored multiple times have a key starting with "-" + for (vector::iterator nit = nameMessages.begin(); nit != nameMessages.end(); nit++) { + Message* message = *nit; + map >::iterator keyIt = m_messagesByKey.find(message->getKey()); + if (keyIt != m_messagesByKey.end()) { + vector* keyMessages = &keyIt->second; + if (!keyMessages->empty()) { + for (vector::iterator kit = keyMessages->begin(); kit != keyMessages->end(); kit++) { + if (*kit==message) { + keyMessages->erase(kit--); + } + } + } + } + delete message; + } } + nameMessages.clear(); + } + // free remaining message instances by key + for (map >::iterator it = m_messagesByKey.begin(); it != m_messagesByKey.end(); it++) { + vector keyMessages = it->second; + for (vector::iterator kit = keyMessages.begin(); kit != keyMessages.end(); kit++) { + delete *kit; + } + keyMessages.clear(); } // free condition instances for (map::iterator it = m_conditions.begin(); it != m_conditions.end(); it++) {