应该删除必须是析构函数中的最后一条语句

Should delete necessarily be the last statement in a destructor?

本文关键字:最后 一条 语句 析构函数 删除      更新时间:2023-10-16

我在一本(相当受人尊敬的)书中遇到了这段代码。(注:"头"是Element类型的指针)

Stack::~Stack(){
  while(head){
    Element *next = head->next;
    delete head;
    head = next;
   }
    return;
}

根据我的理解,delete关键字会取消分配给指针的内存。作者是如何在取消分配后立即在下一行中使用指针的?这让我有点困惑。我是不是错过了一些显而易见的东西?

作者是如何在取消分配后立即在下一行中使用指针的?

作者正在将指针重新分配给下一个元素。

delete正在释放磁头指向的内存。它不会"解除分配"指针本身——指针仍然存在并且可用。

然后head = next使head指向不同的内存块(由next指向的块)。被删除的内存再也不用了,所以没有问题。

好问题。类比:老板昨天解雇了鲍勃;今天怎么会有人在鲍勃的桌子旁?

令人困惑的是,通过类比,C++语法不是delete Bob;,而是delete Bobs_desk;—这实际上意味着删除Bob办公桌上的员工,但不会删除办公桌。

鲍勃离开后,老板仍然可以让其他人坐在鲍勃的桌子旁。你明白了吗?