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/