C++正在删除对象

C++ deleting an object

本文关键字:对象 删除 C++      更新时间:2023-10-16

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;
}

您需要删除主对象的析构函数中动态分配的子对象,并且您已经通过删除数组Equipment

正确地完成了这一操作

Delete运算符确实按照您的说法删除了所有"子对象",但通常情况下,您不仅需要删除"子对象",还需要删除成员指针指向的内存。因此,例如,如果您使用矢量对象,它将被自动删除,但在这种情况下,您需要显式删除它,这是正确的

简单地说,在销毁对象期间:

  • 成员对象本身已销毁
  • 成员指针指向的对象不是

这意味着你必须手动删除它们(就像你的Equipement指针一样),如果你拥有它们。可能会出现这样的情况:您的类最终带有一个不属于它的指针(例如,该类中需要的某个其他对象的句柄),因此不应该删除。

您可以使用智能指针(即:std::shared_ptrstd::unique_ptr等)以更安全的方式管理内存(特别是,它们会根据RAII原则自动删除所管理的指针)。

您缺少的一件事是类设备中的析构函数

您在示例中所做的工作就足够了

delete[] Equipment;

在玩家的析构函数中,所以一旦玩家被删除,所有包含的设备都会被删除。

干得好!