2012-04-14 37 views
1

我有一个叫做SpriteX的类,它基本上是一个普通的精灵。我也有一个叫_Drawables的课程,它有一个成员std::vector<SpriteX*>。在main()中,我创建的每个精灵都可以插入到_Drawables容器中,然后可以调用drawAll()方法绘制std::vector中的所有SpriteX对象。从类中删除指向这个的指针?

每个SpriteX对象都知道指向自己的指针位于哪个索引处,并且在其析构函数中,它将指针设置为NULL。但我想彻底销毁指针,而不是将其设置为NULL。但是删除指针安全吗?如果我在析构函数中使用delete,并调用析构函数,是否会导致循环?有什么办法可以释放内存吗?

+1

备注:名称'_Drawables'在C++中是非法的;你应该重命名该类。以下划线+大写字母开头的名称保留用于实施。 – Philipp 2012-04-14 22:32:33

回答

3

如果我在析构函数中使用delete并调用析构函数,会导致循环吗?

是的,这可能会导致堆栈溢出和崩溃。

但是你不需要那样做,因为如果你在析构函数中,你已经在删除内存了,对吗? (如,你不显式调用我希望析构函数)

+1

析构函数本身不会“删除内存”。它只是执行对象的销毁逻辑。在调用对象的析构函数后,内存由'delete' *释放。 – 2012-04-14 20:25:01

+0

不,你不是。您可以手动调用MyClass ::〜MyClass,在某些情况下它甚至是有意义的(例如,新放置)。 – bitmask 2012-04-14 20:25:06

+0

我知道析构函数并没有释放内存,最后我的问题...... – 2012-04-14 20:26:21

1

使用Boost::shared_ptr<>

如此宣布你的载体是:

std::vector<boost::shared_ptr<SpriteX> > 

然后,当你删除迭代器或清除条目引用计数将变为零,内存将被释放。

如果你已经在你的析构函数中,那么删除this就像你在析构函数中一样没有意义。

1

你试图在这里重新发明轮子,而且你做得不好(这是一个复杂的轮子)。

在这里使用智能指针,例如, std::unique_ptr(如果你使用C++ 11)或boost::shared_ptr

如果我在析构函数中使用delete,并且调用析构函数,会导致循环吗?

是的。它没有任何意义......析构函数如何在第一个地方被调用?你真的手动调用指针上的析构函数吗?虽然这是可能的,但这很可能是一个非常糟糕的主意。

1

根据你在做什么,你可能想完全放弃指针,只使用std::vector<SpriteX>

或者,如果您想要指针但不会在main()结束时清除它们,请考虑boost::ptr_vector。它会为您提供与std::vector<>相同的语法,但您必须使用指针来使用push_back。此外,它将拥有你的指针的所有权,所以你不必担心删除它们。

如果您将SpriteX单独传递给函数,或者如果它们具有复杂的生命周期,则使用std::vector<boost::shared_ptr<SpriteX> >。如果在同一范围内定义和删除它们,我会坚持更简单一些。

+0

问题是,我在实际的对象上调用move-type方法,'_Drawables'类阻止我明确地在每个'SpriteX'对象上调用'draw() – rcplusplus 2012-04-14 20:43:55