C++ C++;删除对象

C++ C++;删除对象,c++,delete-operator,C++,Delete Operator,delete()操作符是否也销毁对象的所有子对象? 或者在删除父对象之前是否需要调用子对象的删除 class equipment { public: int model_id; ... } class player { public: int x, y; equipment * Equipment; player(void) { Equipment = new equipment[2];}; ~player(void)

delete()
操作符是否也销毁对象的所有子对象? 或者在删除父对象之前是否需要调用子对象的删除

class equipment
{
   public:
     int model_id;
     ...
}

class player
{
   public:
     int x, y;
     equipment * Equipment; 
     player(void) { Equipment = new equipment[2];};
     ~player(void) { delete [] Equipment; }
};

int main (....)
{
  player = new Player;
  ...
  ...
  delete Player;
}

您需要在主对象的析构函数中删除动态分配的子对象,并且您已经通过删除数组
设备
正确地完成了此操作,您缺少的一件事是类设备中的析构函数删除操作符确实删除了您所说的所有“子对象”,但通常情况下,您不仅需要删除“子对象”,还需要删除成员指针指向的内存。

例如,如果您使用vector object,它将被自动删除,但在这种情况下,您需要显式删除它,这是正确的

delete[] Equipment;
在玩家的析构函数中,所有包含的装备将在玩家被删除后立即被删除


干得好

简单地说,在销毁对象的过程中:

  • 成员对象本身被销毁
  • 成员指针指向的对象不是
这意味着如果您拥有它们,您必须手动删除它们(如
设备
指针)。可能会出现这样的情况:您的类以一个它不拥有的指针结束(例如,该类中需要的某个其他对象的句柄),因此不应该删除


您可以使用智能指针(即:,等)以更安全的方式管理内存(特别是,它们会自动删除它们管理的指针,并遵循命令)。

只要只有简单的数据类型(如int),就不需要声明析构函数。它们甚至不必是简单的数据类型,只要他们自己清理干净。感谢您的快速响应,我有没有办法检查子对象是否已从内存中正确删除?@Wracker:只是在设计/实现类时要小心,或者使用习惯用法来避免这样做。例如:如果您总是并且只在构造函数中分配内存,那么您知道必须在析构函数中取消分配内存;否则,在未分配内存时,必须确保指针为空,并在解除分配之前检查指针;或者您可以使用智能指针(如
unique\u ptr
shared\u ptr
)在调用析构函数或类时不必担心释放问题。调用
delete[]equipment
后为什么类“equipment”的析构函数没有执行?@Wracker,在调用delete[]好的,它正在工作,只是我的代码中有一个输入错误。谢谢你的帮助!你的课坏了。请看:事实是,在我删除设备对象之后,我仍然可以访问它的数据~玩家(无效){delete[]设备;std:;coutBut内存现在可以用于其他东西-然后可以更改。之后尝试新建另一个对象-很有可能获得完全相同的内存地址。内存不会被删除,只是标记为“不再使用”@Wracker:您可以访问已删除的对象,但这是未定义的行为。当您删除该对象时,内存会被释放。这并不意味着这些位会被覆盖。它们会一直存在,直到有东西在使用内存位置。但您不再拥有该内存空间。