Почему мое приложение вылетает при удалении? - PullRequest
2 голосов
/ 15 июля 2011
while(!m_RemoveNodeList.empty())
{
    list<CNode *>::const_iterator const it = m_RemoveNodeList.begin();

    CNode * const pNode = *it;
    ASSERT(pNode != NULL);

    m_NodeList.remove( pNode );

    delete pNode; // crashing here

    m_RemoveNodeList.pop_front();
}

Выше иногда происходит сбой при удалении с исключением нарушения чтения. Могу ли я быть, что я случайно дважды удалить?

и m_NodeList, и m_RemoveNodeList имеют тип

 std::list<CNode *>

Я должен отметить, что CNode является базовым классом для нескольких других классов. однако ни один из этих классов ничего не делает в своих деструкторах

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

В вашем коде нет явных сбоев, и он выглядит нормально.

Сбой может произойти, только если в list<CNode*> хранятся дубликаты CNode*;что приведет вас к нескольким delete.(это упоминается @ pau.estalella в комментариях).

Вы можете попробовать следующий метод, чтобы поймать, если есть дубликат CNode*.

map<CNode*, int> duplicate;
while(m_RemoveNodeList.size() > 0)
{
    list<CNode *>::const_iterator const it = m_RemoveNodeList.begin();
    CNode * const pNode = *it;
    if(duplicate.find(pNode) == duplicate.end())
      duplicate[pNode] = 1;
    else
      cout<<"Caught: "<<pNode<<endl;
// ...
}
0 голосов
/ 15 июля 2011

pNode - это просто ссылка на оригинал, а не копия. Не уверен, что делает удаление, но если действительно делает оригинал, у вас есть двойное удаление.

...