从向量中擦除指针

Posted

技术标签:

【中文标题】从向量中擦除指针【英文标题】:Erasing a pointer from a vector 【发布时间】:2010-11-29 15:08:54 【问题描述】:

我正在尝试擦除指向对象的指针,但我一直在崩溃控制台 (PS2),由于控制台的设置方式,我没有收到任何错误,所以我不太确定是什么正在进行中。

我已经列出了错误的两行,直到我添加了这些行才出现错误。

    for(listIter = m_downDirectionList.begin(); listIter != m_downDirectionList.end(); listIter++)
    
        Projectile* proj = dynamic_cast<Projectile*>(*listIter);

        if (proj->getZWorldCoord() >= (defaultLevelDepth + zOffset))
        
            proj->getPoolOwner()->releaseAProjectile(proj);
            //(*listIter) = NULL; // THIS ERRORS, also tried = 0.
            //listIter = m_downDirectionList.erase(listIter); // THIS ALSO ERRORS
        

        else
        
            (*listIter)->update(camera, zOffset);
        
    

我做错了什么?

谢谢。

编辑: 澄清一下,只有这一行。

listIter = m_downDirectionList.erase(listIter);

这也是错误的。

【问题讨论】:

我真的不知道m_downDirectionList 是什么,或者releaseAProjectile 是做什么的。我也不知道是哪种错误,或者你的测试技术,或者错误是否一致。 关于编辑。如果您指的是我的解决方案,我所做的不仅仅是添加该行。我还将迭代器增量移动到 else 块。发布后我打算用解释来编辑我的答案,但Kos 已经解释了这个问题。 欺骗***.com/questions/2728551/c-iterators-problem/2728567 ? 【参考方案1】:
for(listIter = m_downDirectionList.begin(); listIter != m_downDirectionList.end(); )
    
        Projectile* proj = dynamic_cast<Projectile*>(*listIter);

        if (proj->getZWorldCoord() >= (defaultLevelDepth + zOffset))
        
            proj->getPoolOwner()->releaseAProjectile(proj);
            listIter = m_downDirectionList.erase(listIter);
        

        else
         //m_downDirectionList[p]->update(camera, zOffset);
            (*listIter)->update(camera, zOffset);
            listIter++
        
    

【讨论】:

也正确和优雅(我对 ++listIter 的评论仍然成立,虽然:)) 需要注意的是,这是行得通的,因为它是一个向量(是的,这很清楚,但问题和答案在空间上很远......)。【参考方案2】:
  m_downDirectionList.erase (listIter);

【讨论】:

以上是关于从向量中擦除指针的主要内容,如果未能解决你的问题,请参考以下文章

从向量中擦除对象会导致双重释放[重复]

C ++没有匹配函数来调用向量中的擦除

从向量中删除项目

使用指向值的原始指针从 std::list<Value> 中擦除?

通过指针擦除 STL 向量

对于向量中的指针,我们应该在擦除之前还是之后删除?