我的目标是在任何物体撞击时删除它。我在抛射物类中有一个函数,它返回抛射物状态的布尔值(是否删除)。问题是我不知道应该删除它的时间和地点。
在我的项目中,我创建了一个射弹并将其添加到两个不同的类中,并带有一个std :: list。第一类(让我们说它在ProjectileGestion中)包含所有的射弹并在将它们发送到DrawGestion之前更新它们(DrawGestion将按y的顺序放置每个精灵并绘制它们)。第二个类是一个四叉树,它包含一个周界内所有对象的列表(每个帧,它检查列表中的每个对象是否仍然适合并将检查冲突)。目前,我不会删除任何射弹,因为我不知道如何。我想到了两个选择:
只有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。我做了与选项1中相同的检查,但是我只删除了列表中的对象,我实际上并没有删除对象。这样,当每个列表都将从中删除对象时,该对象将被删除。 (注意我之前从未使用过智能指针。)
那么哪种方式更有效并且不太容易导致内存泄漏?
答案 0 :(得分:0)
它们应该具有相同的效率,因为std :: unique_ptr将使用模板代码,该代码将添加与您编写的代码类似的代码。但是,如果您更改该代码或添加处理指针的其他代码,则使用std :: unique_ptr将不易出错。
更重要的是,unique_ptr代码使您的意图更加明确,并使代码更易于阅读和维护。您可以通过查看声明来判断它是一个独占物品列表,并且您的擦除变为1行。