使用shared_ptr删除列表中的对象

问题描述:

我的目标是在任何时候删除一个子弹。我在弹丸类中有一个函数,它返回抛射体状态的布尔值(是否删除)。问题是我不知道何时何地应该删除它。使用shared_ptr删除列表中的对象

在我的项目中,我正在创建一个子弹并将其添加到两个不同的类中,并加入了一个std :: list。第一类(假设它在ProjectileGestion中)包含所有投射物,并在将它们发送到DrawGestion之前更新它们(DrawGestion会将每个精灵按y排序并绘制它们)。第二类是Quadtree,其中包含周边内的所有对象的列表(每个框架,它检查列表中的每个对象是否仍然适合并将检查冲突)。目前,我不删除任何抛射物,因为我不知道如何。我想到了2个选项:

  1. 只有ProjectileGestion可以删除射弹。每当它删除一个对象时,它将删除该对象并将该指针的值更改为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的声明object.I时一样检查了,因为我在选项1一样,但我只从列表中删除的对象,我不实际上删除该对象。这样,当每个列表都会从中删除对象时,该对象将被删除。 (请注意,我以前从未使用智能指针)。

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

+0

我会试图不删除它们,只是为了将它们标记为已删除。然后,当你需要一个新的弹丸时,选择其中一个标记为已删除的弹药。这样你就不会一直分配/释放内存。你也可以使用一个'std :: vector'作为你的实时抛射列表,因为它们的缓存友好性意味着在很多情况下你可能会认为'std :: list'使得它们可以超越'std :: list'感。 – Galik

+0

嗯,这是我的第一个项目(我在家学习C++),所以我想保持简单。我的代码是围绕std :: list和“删除”:/ –

它们应该具有相同的效率,因为std :: unique_ptr将使用模板代码,它会为您写的代码添加类似的代码。但是,如果您更改该代码或添加处理指针的其他代码,则使用std :: unique_ptr将不太容易出错。

更重要的是,unique_ptr代码使您的意图更加明确,并使代码更易于阅读和维护。你可以通过查看声明来判断它是一个专有对象的列表,并且你的擦除变为1行。

+0

如果我明白你在说什么,std :: unique_ptr会对我的选项1加号吗? –

+0

是的 - 我误以为你的第二个选项是unique_ptr而不是shared_ptr。我会让它std :: list >然后你的3删除行就变成了“listOfObjects.erase(i ++)” – davidpet

+0

谢谢!我认为shared_ptr是要做的事情 –