C++ 是否从类中删除指向此的指针?

C++ 是否从类中删除指向此的指针?,c++,pointers,memory-management,C++,Pointers,Memory Management,我有一个叫做SpriteX的类,它基本上是一个普通的sprite。我还有一个名为_Drawables的类,它有一个成员std::vector。大体上,我创建的每个sprite都可以插入到_Drawables容器中,然后可以调用drawAll方法来绘制std::vector中的所有SpriteX对象 每个SpriteX对象都知道指向自身的指针所在的索引,并在其析构函数中将指针设置为NULL。但是我想完全销毁指针,而不仅仅是将其设置为NULL。但是删除指针安全吗?如果我在析构函数中使用delete,

我有一个叫做SpriteX的类,它基本上是一个普通的sprite。我还有一个名为_Drawables的类,它有一个成员std::vector。大体上,我创建的每个sprite都可以插入到_Drawables容器中,然后可以调用drawAll方法来绘制std::vector中的所有SpriteX对象

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

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

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

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

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

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

但是你不需要这样做,因为如果你在析构函数中,你已经在删除内存了,对吗?与中一样,您没有显式调用析构函数,我希望使用Boost::shared\u ptr

因此,将向量声明为:

std::vector<boost::shared_ptr<SpriteX> >
然后,当您擦除迭代器或清除条目时,引用计数将变为零,内存将被释放

如果您已经在析构函数中,那么在析构函数中删除它是没有意义的。

使用Boost::shared\u ptr

因此,将向量声明为:

std::vector<boost::shared_ptr<SpriteX> >
然后,当您擦除迭代器或清除条目时,引用计数将变为零,内存将被释放


如果你已经在析构函数中,那么删除它是没有意义的,因为你在析构函数中。

你试图在这里重新发明轮子,但你做得不好,这是一个复杂的轮子

如果您使用的是C++11或boost::shared\u ptr,请在此处使用智能指针,例如std::unique\u ptr

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


对。这是没有意义的…析构函数一开始是如何调用的?您实际上是在指针上手动调用析构函数吗?虽然这是可能的,但这很可能是一个非常糟糕的主意。

你试图在这里重新发明轮子,但你做得不好,这是一个复杂的轮子

如果您使用的是C++11或boost::shared\u ptr,请在此处使用智能指针,例如std::unique\u ptr

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


对。这是没有意义的…析构函数一开始是如何调用的?您实际上是在指针上手动调用析构函数吗?虽然这是可能的,但很可能是一个非常糟糕的主意。

根据您所做的工作,您可能希望完全放弃指针,而只使用std::vector

或者,如果你想有指针,但直到主结束时才清除它们,那么考虑一个Booost::它将为您提供与std::vector相同的语法,唯一的例外是您必须使用指针将_向后推。此外,它将获得指针的所有权,因此您不必担心删除它们


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

根据您所做的工作,您可能希望完全放弃指针,而只使用std::vector

或者,如果你想有指针,但直到主结束时才清除它们,那么考虑一个Booost::它将为您提供与std::vector相同的语法,唯一的例外是您必须使用指针将_向后推。此外,它将获得指针的所有权,因此您不必担心删除它们


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

析构函数本身不“删除内存”。它只执行对象的销毁逻辑。内存在调用对象的析构函数后由delete释放。不,您没有。您可以手动调用MyClass::~MyClass,甚至在某些情况下也有意义,例如。@LuchianGrigore当精灵超出范围时,即main结束时,会调用析构函数。但你要说的是,析构函数删除指针持有的内存?@rcplusplus如果sprite超出范围,则意味着你在自动内存中创建它,即你没有使用新的内存分配内存。也就是说
内存是自动释放的,您不需要也不应该显式地清除它。析构函数本身不“删除内存”。它只执行对象的销毁逻辑。内存在调用对象的析构函数后由delete释放。不,您没有。您可以手动调用MyClass::~MyClass,甚至在某些情况下也有意义,例如。@LuchianGrigore当精灵超出范围时,即main结束时,会调用析构函数。但你要说的是,析构函数删除指针持有的内存?@rcplusplus如果sprite超出范围,则意味着你在自动内存中创建它,即你没有使用新的内存分配内存。这意味着内存是自动释放的,你不需要也不应该显式清除它。问题是,我在实际对象上调用move-type方法,_-Drawables类只是阻止我在每个SpriteX对象上显式调用draw。问题是,我在实际对象上调用move-type方法,我的TraceFube类阻止我在每个SpRITEX对象边注释中显式调用DRAW:在C++中,名称“TRAIL”是非法的;你应该重命名那个类。从下划线+大写字母开始的名称保留在执行中。侧注:C++中的名称“Table”是非法的;你应该重命名那个类。以下划线+大写字母开头的名称保留用于实现。