C++删除一个对象

3
< p > delete() 运算符是否也会销毁对象的所有子对象? 或者在删除父对象之前,我需要调用子对象的 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;
}

2
你的类出了问题。请参阅:三法则 - Benjamin Lindley
5个回答

3

您需要在主对象的析构函数中删除动态分配的子对象,并通过删除数组Equipment来正确执行此操作。


谢谢您的快速回复,有没有办法我可以实际检查子对象是否已经从内存中正确删除? - Wracker
1
@Wracker:在设计/实现类时要小心,或使用惯用语以避免这种情况。例如:如果您仅在构造函数中分配内存,则知道必须在析构函数中释放内存;否则,在未分配内存时必须确保指针为空,并在释放之前进行检查;或者您可以使用智能指针(如unique_ptrshared_ptr),在调用析构函数或您的类时不必担心释放问题。 - Gonmator
@Wracker,在调用delete[]后,设备的析构函数被称为“删除”。 - fatihk
好的,它正在工作,只是我的代码中有一个打字错误。感谢您的帮助! - Wracker
@phonetagger:现在我们只需在这些不需要的成员声明中添加= delete。这样即使在类内部也能捕获到意外使用。 - MSalters
显示剩余4条评论

2

删除运算符确实会删除所有"子对象",但通常情况下,在您的情况下,您需要删除的不仅是"子对象",还包括成员指针指向的内存。 例如,如果您使用 vector 对象,则会自动删除它,但在这种情况下,您需要显式地删除它,而您做得很正确。


1
简单来说,在对象销毁过程中:
- 成员对象会被自动销毁 - 由成员指针所指向的对象不会被销毁
这意味着如果你拥有它们,你需要手动删除它们(比如你的Equipement指针)。有时候你的类可能会持有一些它并不拥有的指针(例如一个指向其他必需对象的句柄),因此不应该删除它们。
你可以使用智能指针(例如:std::shared_ptrstd::unique_ptr等)以更安全的方式管理内存(它们会自动删除所管理的指针,遵循RAII原则)。

0
你所遗漏的是设备类中的析构函数。

1
只要只有简单的数据类型(如int),声明析构函数是不必要的。 - fredrik
它们甚至不必是简单的数据类型,只要它们在使用完毕后自己清理干净。 - Benjamin Lindley

0

你在例子中所做的事情已经足够了,你

delete[] Equipment;

在玩家的析构函数中,所有包含的装备都会在玩家被删除时立即被删除。
干得好!

事实是,我删除了Equipment对象后,仍然可以访问它的数据。~player(void) { delete [] Equipment; std:;cout<<Equipment->model_id; } 我的意思是,它打印出model_id,就好像对象仍然在内存中一样。 - Wracker
但是现在可以将内存用于其他事情 - 并且以后可能会更改。之后只需尝试创建新对象 - 很有可能您会获得完全相同的内存地址。内存不会被删除,只是标记为“不再使用”。 - Xie
@Wracker:你可以访问一个已删除的对象,但这是未定义的行为。当你删除对象时,内存被释放。这并不意味着位被覆盖。它们一直存在,直到有东西使用该内存位置。但你不再拥有那个内存空间。 - Skalli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接