在删除链接列表中的节点时,Node *接下来会发生什么?

问题描述 投票:2回答:2

在使用的链接列表中

struct Node {
  T value;
  Node* next; 
}

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

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

我的问题是,即使在使用删除后,究竟是什么“删除”允许我使用下一个指针?它只删除了值吗?这实际上是如何看待记忆的?

c++ pointers memory-management
2个回答
1
投票

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

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

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


0
投票

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

正确的析构函数声明将是:

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

顺便说一句:请阅读一些关于如何实施清单的好书。

BTW.2:如果你真的需要的话,可以使用vectorlist等标准容器。

© www.soinside.com 2019 - 2024. All rights reserved.