使用共享_ptr删除列表中的对象
Deleting objects within a list with shared_ptr
我的目标是在击中某些东西时删除弹丸。我在弹丸类中具有一个函数,可以返回弹丸状态的布尔值(是否要删除)。问题是我不知道何时何地将其删除。
在我的项目中,我正在创建一个弹丸,并在2个不同的类中使用std ::列表添加它。一类(假设它是在弹性弹性的中)包含所有弹丸,并在将它们发送到绘制疗中之前将它们更新为每个帧(绘制势将将每个精灵按y命中列出并绘制它们)。第二类是一个Quadtree,其中包含列表中所有对象的列表(每个帧,它都会检查其列表中的每个对象是否仍然适合并检查碰撞)。目前,我不知道如何删除任何弹丸。我想到了2个选项:
-
只有弹丸才能删除弹丸。每当删除对象时,它都会删除对象并将指针的值更改为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行。
相关文章:
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 从封装在对象中的函数 C++ 返回时为空的列表
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 链接列表在 cpp 中包含不同的对象类
- 如何使用对象制作分数列表并获得平均值
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 如何获取列表的每个对象并调用getName方法来打印其名称
- 如何在Windows Media Foundation SDK中指定语言列表对象
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 将类的每个实例添加到列表对象的构造函数
- 列表<对象*>迭代器中的分段错误
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 如何防止客户端修改列表对象
- c++列表对象错误
- 在列表对象中使用对象的派生函数
- 编译器错误 使用列表<对象*的迭代器> C++