corrected deallocation of messages stored by key only

This commit is contained in:
john30
2015-11-08 12:12:17 +01:00
parent 555f06a5f5
commit e19173ff73
+28 -7
View File
@@ -1205,15 +1205,36 @@ void MessageMap::clear()
m_pollMessages.top(); m_pollMessages.top();
m_pollMessages.pop(); m_pollMessages.pop();
} }
// free message instances // free message instances by name
for (map<string, vector<Message*> >::iterator mit = m_messagesByName.begin(); mit != m_messagesByName.end(); mit++) { for (map<string, vector<Message*> >::iterator it = m_messagesByName.begin(); it != m_messagesByName.end(); it++) {
if (mit->first[0] != '-') { // avoid double free: instances stored multiple times have a key starting with "-" vector<Message*> nameMessages = it->second;
vector<Message*> messages = mit->second; if (it->first[0] != '-') { // avoid double free: instances stored multiple times have a key starting with "-"
for (vector<Message*>::iterator it = messages.begin(); it != messages.end(); it++) for (vector<Message*>::iterator nit = nameMessages.begin(); nit != nameMessages.end(); nit++) {
delete *it; Message* message = *nit;
messages.clear(); map<unsigned long long, vector<Message*> >::iterator keyIt = m_messagesByKey.find(message->getKey());
if (keyIt != m_messagesByKey.end()) {
vector<Message*>* keyMessages = &keyIt->second;
if (!keyMessages->empty()) {
for (vector<Message*>::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<unsigned long long, vector<Message*> >::iterator it = m_messagesByKey.begin(); it != m_messagesByKey.end(); it++) {
vector<Message*> keyMessages = it->second;
for (vector<Message*>::iterator kit = keyMessages.begin(); kit != keyMessages.end(); kit++) {
delete *kit;
}
keyMessages.clear();
}
// free condition instances // free condition instances
for (map<string, Condition*>::iterator it = m_conditions.begin(); it != m_conditions.end(); it++) { for (map<string, Condition*>::iterator it = m_conditions.begin(); it != m_conditions.end(); it++) {
delete it->second; delete it->second;