使用共享_ptr删除列表中的对象

Deleting objects within a list with shared_ptr

本文关键字:列表 对象 删除列 删除 共享 ptr      更新时间:2023-10-16

我的目标是在击中某些东西时删除弹丸。我在弹丸类中具有一个函数,可以返回弹丸状态的布尔值(是否要删除)。问题是我不知道何时何地将其删除。

在我的项目中,我正在创建一个弹丸,并在2个不同的类中使用std ::列表添加它。一类(假设它是在弹性弹性的中)包含所有弹丸,并在将它们发送到绘制疗中之前将它们更新为每个帧(绘制势将将每个精灵按y命中列出并绘制它们)。第二类是一个Quadtree,其中包含列表中所有对象的列表(每个帧,它都会检查其列表中的每个对象是否仍然适合并检查碰撞)。目前,我不知道如何删除任何弹丸。我想到了2个选项:

  1. 只有弹丸才能删除弹丸。每当删除对象时,它都会删除对象并将指针的值更改为null。在其他类Quadtree中,当我使用迭代器循环列表时,我检查每个迭代器是否等于NULL。如果是这样,则课程将从列表中删除迭代器并继续。

    std::list<Object*>::iterator i = listOfObjects.begin();
    while(i != listOfObjects.end())
    {
    //Update()
    if((*i)->IsToDelete())
        {
           delete *i;
           *i = NULL;
           listOfObjects.erase(i++);
        }
    else
        {
           i++;
        }
    }
    

2:声明对象时使用std :: shared_ptr。这样,当每个列表都从中删除对象时,将删除对象。(请注意,我以前从未使用过智能指针)。

那么,哪种方式更有效,并且不容易导致内存泄漏?

它们的效率应大致相同,因为std :: simolor_ptr将使用模板代码,该代码将添加与您所写的代码相似。但是,如果您更改该代码或添加其他涉及指示器的代码,则使用std :: unique_ptr会较小。

更重要的是,唯一的_ptr代码使您的意图更加明确,并使代码易于阅读和维护。您可以通过查看声明来确定它是一个独家拥有的对象的列表,而您的擦除变为1行。