从类中删除指向此内容的指针
Deleting a pointer to this from class?
我有一个名为SpriteX
的类,它基本上是一个通用的精灵。我还有一个名为_Drawables
的类,它有一个成员std::vector<SpriteX*>
。main()
我创建的每个精灵都可以插入到_Drawables
容器中,然后可以调用drawAll()
方法来绘制std::vector
中的所有SpriteX
对象。
每个SpriteX
对象都知道指向自身的指针位于哪个索引,并且在其析构函数中,它将指针设置为 NULL
。但我想完全销毁指针,而不仅仅是将其设置为 NULL
.但是删除指针安全吗?如果我在析构函数中使用delete
,并且调用析构函数,这会导致循环吗?有没有办法释放内存。
如果我在析构函数中使用 delete 并调用析构函数,这会导致循环吗?
是的,这可能会导致堆栈溢出和崩溃。
但是你不需要这样做,因为如果你在析构函数中,你已经在删除内存,对吧?(就像,我希望你没有明确调用析构函数)
你试图在这里重新发明轮子,但你做得不好(这是一个复杂的轮子)。
在此处使用智能指针,例如 std::unique_ptr
(如果您使用的是 C++11)或boost::shared_ptr
.
如果我在析构函数中使用 delete,并且调用析构函数,这会导致循环吗?
是的。这毫无意义...析构函数首先是如何调用的?您实际上是在指针上手动调用析构函数吗?虽然这是可能的,但这很可能是一个非常糟糕的主意。
根据您正在执行的操作,您可能希望完全放弃指针,而只使用std::vector<SpriteX>
。
或者,如果您想拥有指针,但直到 main()
年底才清除它们,请考虑boost::ptr_vector
。它将为您提供与std::vector<>
相同的语法,除了您必须使用指针push_back
。此外,它将拥有您的指针的所有权,因此您不必担心删除它们。
如果要将SpriteX
单独传递到函数中,或者如果它们具有复杂的生命周期,请使用std::vector<boost::shared_ptr<SpriteX> >
。但是,如果在同一范围内定义和删除它们,我会坚持使用更简单的方法。
使用 Boost::shared_ptr<>
因此,将您的向量声明为:
std::vector<boost::shared_ptr<SpriteX> >
然后,当您擦除迭代器或清除条目时,引用计数将变为零,内存将被释放。
如果您已经在析构函数中,则删除this
就像您在析构函数中一样是没有意义的。
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存