【问题标题】:Why does my app crash at delete?为什么我的应用程序在删除时崩溃?
【发布时间】:2011-07-15 09:46:24
【问题描述】:
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 是其他几个类的基类。但是这些类都没有在它们的析构函数中做任何事情

【问题讨论】:

  • m_RemoveNodeList 是如何声明的?它是如何填充的?
  • 我已经相应地编辑了我的问题
  • 值得将 size() 替换为 empty()。如果 m_RemoveNodeList 是一个链表,那么 size 是 O(N) 操作,而 empty 是 O(1)。
  • 向我们展示CNode的析构函数。
  • m_RemoveNodeList 中有重复的元素吗?其他任何地方都没有其他 CNode 删除?

标签: c++ pointers stl delete-operator


【解决方案1】:

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

只有当list&lt;CNode*&gt; 中存储有重复 CNode* 时,它才会崩溃;这将引导您访问多个delete。 (@pau.estalella 在 cmets 中提到过)。

如果有重复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;
// ...
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      相关资源
      最近更新 更多