在链表中删除该节点时,下一步将如何处理Node *?

时间:2019-04-09 10:21:52

标签: 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 指针 即使在使用删除之后?它只会删除值吗?实际在内存中看起来如何?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

删除数据后,指针将变为未定义状态,并且确保不会到达其之前指向的内存,因此删除后将无法调用tmp=tmp->next'

正确的析构函数声明为:

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

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

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