Почему мое приложение вылетает при удалении?

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 является базовым классом для нескольких других классов. однако ни один из этих классов ничего не делает в своих деструкторах


person clamp    schedule 15.07.2011    source источник
comment
Как объявлен m_RemoveNodeList? Как он заселен?   -  person CB Bailey    schedule 15.07.2011
comment
я соответствующим образом отредактировал свой вопрос   -  person clamp    schedule 15.07.2011
comment
Стоит заменить size () на empty (). Если m_RemoveNodeList является связанным списком, тогда размер равен O (N) операции, тогда как пустой - O (1).   -  person Jeff Foster    schedule 15.07.2011
comment
Покажите нам деструктор CNode.   -  person NPE    schedule 15.07.2011
comment
Есть ли повторяющиеся элементы в m_RemoveNodeList? Никаких других удалений CNodes где-либо еще?   -  person pau.estalella    schedule 15.07.2011
comment
@pau, хорошее замечание. Я проверю это.   -  person clamp    schedule 15.07.2011
comment
Он может содержать поврежденные указатели, поврежденный участок памяти или место, которое могло быть освобождено ранее. Проследите за распределением и освобождением.   -  person sarat    schedule 15.07.2011


Ответы (2)


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

Это может привести к сбою, только если в list<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;
// ...
}
person iammilind    schedule 15.07.2011

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

person Jahmic    schedule 15.07.2011