我有一个名为SpriteX
的类,它基本上是一个通用的精灵。我还有一个名为_Drawables
的班级,其成员为std::vector<SpriteX*>
。在main()
中,我创建的每个精灵都可以插入到_Drawables
容器中,然后可以调用drawAll()
方法绘制SpriteX
中的所有std::vector
个对象。
每个SpriteX
对象都知道指向自身的指针所在的索引,并且在其析构函数中,它将指针设置为NULL
。但我想完全破坏指针,而不是将其设置为NULL
。但删除指针是否安全?如果我在析构函数中使用delete
,并且调用析构函数,那会导致循环吗?有没有办法释放记忆。
答案 0 :(得分:3)
如果我在析构函数中使用delete并调用析构函数,会导致循环吗?
是的,这可能会导致堆栈溢出和崩溃。
但你不需要这样做,因为如果你在析构函数中,你已经删除了内存,对吧? (因为,你没有明确地调用析构函数我希望)
答案 1 :(得分:1)
使用Boost::shared_ptr<>
所以声明你的矢量为:
std::vector<boost::shared_ptr<SpriteX> >
然后当你擦除迭代器或清除条目时,引用计数将变为零并且内存将被释放。
如果您已经在析构函数中,那么删除this
就像在析构函数中一样没有意义。
答案 2 :(得分:1)
你正试图在这里重新发明轮子,你做得不好(这是一个复杂的轮子)。
在这里使用智能指针,例如std::unique_ptr
(如果您使用的是C ++ 11)或boost::shared_ptr
。
如果我在析构函数中使用delete,并调用析构函数,会导致循环吗?
是。它没有任何意义......首先是如何调用析构函数?你真的在指针上手动调用析构函数吗?虽然这是可能的,但这很可能是一个非常糟糕的主意。
答案 3 :(得分:1)
根据您正在做的事情,您可能希望完全放弃指针并使用std::vector<SpriteX>
。
或者,如果您想拥有指针,但在main()
结束前不会清除它们,请考虑使用boost::ptr_vector
。它将为您提供与std::vector<>
相同的语法,但您必须使用指针push_back
。此外,它将获取指针的所有权,因此您不必担心删除它们。
如果您将std::vector<boost::shared_ptr<SpriteX> >
单独传递给函数,或者它们的生命周期复杂,请使用SpriteX
。但是,如果在相同的范围内定义和删除它们,我会坚持一些更简单的东西。