从类中删除指向此的指针?

时间:2012-04-14 20:19:14

标签: c++ pointers memory-management

我有一个名为SpriteX的类,它基本上是一个通用的精灵。我还有一个名为_Drawables的班级,其成员为std::vector<SpriteX*>。在main()中,我创建的每个精灵都可以插入到_Drawables容器中,然后可以调用drawAll()方法绘制SpriteX中的所有std::vector个对象。

每个SpriteX对象都知道指向自身的指针所在的索引,并且在其析构函数中,它将指针设置为NULL。但我想完全破坏指针,而不是将其设置为NULL。但删除指针是否安全?如果我在析构函数中使用delete,并且调用析构函数,那会导致循环吗?有没有办法释放记忆。

4 个答案:

答案 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。但是,如果在相同的范围内定义和删除它们,我会坚持一些更简单的东西。