3

操作员是否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;
}
4

5 回答 5

3

您需要在主对象的析构函数中删除动态分配的子对象,并且您已通过删除数组正确完成此操作Equipment

于 2013-06-24T08:06:20.333 回答
2

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

于 2013-06-24T08:11:22.027 回答
1

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

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

这意味着您必须手动删除它们(如您的Equipement指针),如果您拥有它们。在某些情况下,您的类最终会得到一个它不拥有的指针(例如,您在此类中需要的其他对象的句柄),因此不应删除。

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

于 2013-06-24T08:14:53.020 回答
0

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

于 2013-06-24T08:07:30.823 回答
0

你在你的例子中做的事情就足够了,你

delete[] Equipment;

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

做得很好!

于 2013-06-24T08:12:23.187 回答