1

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

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

4

4 回答 4

3

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

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

但是你不需要这样做,因为如果你在析构函数中,你已经在删除内存,对吧?(如,你没有明确地调用我希望的析构函数)

于 2012-04-14T20:21:07.507 回答
1

采用Boost::shared_ptr<>

所以声明你的向量是:

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

然后,当您擦除迭代器或清除条目时,引用计数将变为零并且内存将被释放。

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

于 2012-04-14T20:22:11.007 回答
1

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

在此处使用智能指针,例如std::unique_ptr(如果您使用 C++11)或boost::shared_ptr.

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

是的。这毫无意义......首先如何调用析构函数?您实际上是在指针上手动调用析构函数吗?虽然这是可能的,但这很可能是一个非常糟糕的主意。

于 2012-04-14T20:22:50.963 回答
1

根据您正在做的事情,您可能希望完全放弃指针而只使用std::vector<SpriteX>.

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

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

于 2012-04-14T20:24:32.383 回答