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是其他几个类的基类。但是这些类都没有在析构函数中做任何事情

最佳答案

您的代码中没有明显的崩溃,看起来还不错。

仅当CNode*中存储了重复 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;
// ...
}

关于c++ - 为什么我的应用在删除时崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6705255/

10-12 12:19