首页 > 解决方案 > 在链表中删除该节点时,Node* 接下来会发生什么?

问题描述

在使用的链表中

struct Node {
  T value;
  Node* next; 
}

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

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

我的问题是,究竟是什么被“删除”了,即使在使用delete之后,我也可以使用next指针?它只删除值吗?它在记忆中的实际表现如何?

标签: c++pointersmemory-management

解决方案


在 C++ 中,当您删除堆上的对象时,实际上并没有清理任何东西,它只是将内存标记为“空闲”。这意味着另一个调用newmalloc可能覆盖该内存。

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

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


推荐阅读