c++ - 在链表中删除该节点时,节点*接下来会发生什么?

标签 c++ pointers memory-management

在链表中使用

struct Node {
  T value;
  Node* next; 
}

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

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

我的问题是,究竟是什么被“删除”,允许我使用 next 指针 即使在使用了delete 之后?它只删除值吗?这实际上在内存中看起来如何?

最佳答案

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

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

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

关于c++ - 在链表中删除该节点时,节点*接下来会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590537/

相关文章:

c++ - 将对象指针 vector 传递给类 (C++)

c++ - 如何在 Windows 中将套接字设置为阻塞模式?

c++ - 为什么 gprof 告诉我从 main() 只调用一次的函数被调用了 102 次?

c++ - C++中的指针和字节数组

c# - .net 内存使用情况,决定私有(private)字节大小的因素

c++ - OpenGL:调整 LOD 角度?

c# - C++ 到 C# 的包装 - 如何处理 C# 中的双指针数组

java - 异常 NullPointer,建议?

c++ - C/C++ argv 内存管理

c++ - 监控堆使用情况