Я не знаком с скрытностью или точными правилами, которые он использует, но кажется, что у вас будет утечка памяти, если имя узла уже есть на карте.То есть, если тело вашего оператора if не выполнено, вы теряете указатель на память, которую вы только что выделили.Возможно, вы хотели что-то вроде:
if (m_name2NodeMap.find(nodeName) == m_name2NodeMap.end())
m_name2NodeMap[nodeName] = NodePtr;
else
delete NodePtr;
NodePtr = NULL;
Редактировать: так как я ответил почти одновременно с Daemin, позвольте мне добавить больше деталей:
Как упомянул ildjarn, вам также необходимо освободить техобъекты, которые попадают на карту, добавляя деструктор:
~graph()
{
for( std::map< std::string, node*>::iterator i = m_name2NodeMap.begin();
i != m_name2NodeMap.end(); ++i )
{
delete i->second;
}
}
Для полноты я должен отметить, что:
- Карта будет удалена автоматически после завершения деструктора, так какэто переменная-член.
- Записи в карте узлов будут удаляться автоматически при удалении карты.
- Ключи строк будут удаляться при удалении записей.
Предпочтительный способ справиться со сложным временем жизни объекта - использовать умный указатель.Например, boost :: shared_ptr или tr1 :: shared_ptr будут работать следующим образом.Примечание: у меня может не быть точного синтаксиса.
class node {
...
}
class graph {
public :
void populateGraph()
{
std::string nodeName = getNodeName();
boost::shared_ptr< node > NodePtr( new node(nodeName) );
NodePtr->setLevel(-1);
if (m_name2NodeMap.find(nodeName) == m_name2NodeMap.end())
m_name2NodeMap[nodeName] = NodePtr;
}
....
private :
std::map< std::string, boost::shared_ptr<node> > m_name2NodeMap;
}
};
Посмотрите, как мы устранили деструктор и явные вызовы для удаления?Теперь объекты узла будут автоматически уничтожены, как и имена узлов.
На другом узле вы должны взглянуть на функцию std :: map :: insert , которая должна исключить это выражение if allвместе.