corrected deallocation of messages stored by key only
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user