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是其他几个类的基类。但是这些课程中没有一个在他们的析构函数中做任何事情
答案 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只是对原始内容的引用,而不是副本。不确定删除是什么,但如果确实是原始的,你有双重删除。