在链表中删除该节点时,Node* 接下来会发生什么情况

What happens to Node* next when deleting that Node in a linked list?

本文关键字:接下来 什么情况 Node 链表 删除 节点      更新时间:2023-10-16

在使用

struct Node {
  T value;
  Node* next; 
}

对于每个使用的新运算符(new Node()),必须有一个删除运算符。此类列表的析构函数示例

~LinkedList(){ 
   Node* tmp = head;
   while(tmp! = nullptr){
     delete tmp;
     tmp = tmp->next;
   }
 }

我的问题是,究竟什么被"删除"了,允许我使用下一个指针即使在使用删除之后?它是否只删除该值?这在记忆中到底是怎么回事?

C++当你删除堆上的对象时,实际上什么都不会被清理,它只是将内存标记为"空闲"。这意味着对newmalloc的另一个调用可能会覆盖该内存。

访问已删除的指针是未定义的行为,因为无法保证驻留在那里的数据。我不太精通操作系统如何处理内存,但我相信,如果这是您从该内存部分中删除的最后一个项目,您的程序甚至可能不再拥有该页面。如果碰巧是这种情况,那么取消引用该指针将导致大多数桌面操作系统上的分段错误。

如果要安全地移动磁头,则应在指针处于活动状态时为下一项分配一个临时值,然后可以从内存中删除底层对象。

当数据被删除时,指针变得未定义,并且肯定不会到达它之前指向的内存,因此删除后无法调用tmp=tmp->next'

正确的析构函数声明是:

~LinkedList()
{
    while (head != nullptr)
    {
        Node * tmp = head->next;
        delete head;
        head = tmp;
    }
}

顺便说一句:请阅读一些关于如何实现列表的好书。

BTW.2:如果您确实需要,请使用一些标准容器,例如vectorlist