为什么我的应用程序在删除时崩溃?

时间:2011-07-15 09:46:25

标签: c++ pointers stl delete-operator

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 个答案:

答案 0 :(得分:3)

您的代码中没有明显的崩溃,看起来很好。

只有在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;
// ...
}

答案 1 :(得分:0)

pNode只是对原始内容的引用,而不是副本。不确定删除是什么,但如果确实是原始的,你有双重删除。