删除之前指向它的指针后,对象会发生什么?

时间:2017-10-30 09:23:53

标签: c++ pointers nodes doubly-linked-list

这个问题从我编写一个删除双链表的头部的函数开始,或者更具体地说我应该问,如果我们在链表中删除指向它的指针,会发生什么?

我的功能写成:

void remHead(){
    Node* tmp = head->next;
    tmp->prev = NULL;
    delete head;
    head = tmp;
}

我问这个问题,因为在我的代码中,我只是让双链表中的第二个节点prev指向NULL,并删除指向头部的指针,并将其重新分配给新头。

我省略的(我认为)是我没有让原始的头部 - >接下来指向一个空白,因为我想知道我们是否刚刚删除了头部指针,它的字段(如prev,next)也被删除了吗?是这样的吗?它是否会导致任何错误,因为如果不是这样的话,那么原来的头部将会指向新的头部?

感谢您的澄清。

3 个答案:

答案 0 :(得分:1)

好吧,什么也没发生,当你调用free / delete时,head元素的内存会被释放,无论它的内容是什么。 C / C ++没有“跟随”指针执行深度释放资源,(如果这是你的问题),因此没有什么可担心的。 BTW,通常,它是泄漏的来源,因为人们应该执行深度释放,但他们忘记了(以为这是自动完成的)

答案 1 :(得分:1)

为了清楚起见,您有:

class Node {
    /*...*/
    Node* prev;
    Node* next;
    /*...*/
};

C ++指针不是智能指针(也许它们是愚蠢的指针)而delete Nodeprev和{{指向的对象不会做任何事情1}}。

除非你实现了一个析构函数next,它可以执行~Node()之类的操作。

这将导致级联删除链,如果您尝试删除单个节点,则必须注意设置delete next;

如果你还包括node->next=nullptr,你也会遇到麻烦,因为它会导致节点删除已经调用delete prev的节点(并且正在进行破坏并调用{{} 1}}在手中的节点上。

出于这个原因,链接列表实现往往不会在节点中放置所有权并在列表中实现过多的所有权:

delete

如果你确实想要一个对象delete另一个指向破坏,那么现代最佳做法是使用~List(){ Node*curr{head}; while(curr!=nullptr){ auto next{curr->next}; delete curr; curr=next; } }

那将是:

delete

但如上所述,如果您进行任何编辑(删除/拼接),通常不会是链接列表的最佳实现。

答案 2 :(得分:-1)

默认情况下,没有任何反应。默认的c ++指针不跟踪"丢失"对象,但从c ++ 11开始有一个解决方案。

<memory> Cpp reference

中声明了几种智能指针类型

跟踪&#34;幽灵对象&#34;并删除它们。