从类中删除指向此内容的指针

Deleting a pointer to this from class?

本文关键字:指针 删除      更新时间:2023-10-16

我有一个名为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就像您在析构函数中一样是没有意义的。