C++ 将指针设置为“nullptr”不会';不能防止双重删除吗?

C++ 将指针设置为“nullptr”不会';不能防止双重删除吗?,c++,pointers,C++,Pointers,我有一个链表实现,其中我有一个LinkedList类,它包含一个名为head\uu的成员,它是指向LinkedListNode的指针。LinkedListNode显然包含一个名为next\uu的成员,我可以使用它单步浏览列表 我有一个析构函数~LinkedList,它从头开始,逐步遍历列表delete——按原样将所有指向LinkedListNode的指针: ~LinkedList() { LinkedListNode *thru = head_; while (thru != nullp

我有一个链表实现,其中我有一个
LinkedList
类,它包含一个名为
head\uu
的成员,它是指向
LinkedListNode
的指针。
LinkedListNode
显然包含一个名为
next\uu
的成员,我可以使用它单步浏览列表

我有一个析构函数
~LinkedList
,它从
头开始
,逐步遍历列表
delete
——按原样将所有指向
LinkedListNode
的指针:

~LinkedList() {
  LinkedListNode *thru = head_;
  while (thru != nullptr) {
    LinkedListNode* toDelete = thru;
    thru = thru->next;
    delete toDelete;
    toDelete = nullptr; // LINE *
  }
这一切都很好。我的问题是,当我认为我会安全地为LinkedListNode类插入析构函数时发生了什么,如下所示:

~LinkedListNode() { 
    if (next_ != nullptr) // LINE **
        delete next_;
}
这给了我一个堆栈溢出错误,我猜这是因为我试图加倍
删除
下一个指针,一次从
链接列表中,一次从
链接列表节点中


我的问题是:不应该将
toDelete
指针设置为第(*)行中的
nullptr
,再加上
if()
签入第(**),防止双重删除错误吗?

您的问题如下:

~LinkedListNode() { 
    if (next_ != nullptr) // LINE **
        delete next_;
}
假设你有一个链表5,4,3,2,1,你的头是5,你的下一个是4,3,依此类推。当你调用这个函数时,你要做的就是删除4,其他的一切都会留在你的系统中,你无法删除3,2,1等等,你删除了唯一指向它们的东西,你再也无法访问它们了。很多人都建议使用递归解决方案,老实说,如果在析构函数中使用它,那么它将不起作用。如果您真的想这样做,您将需要另一个类似这样的函数:

void deleteLinkedList(Node* head){
    if(head == nullptr)return;
    Node* temp = head->next;
    delete head;
    deleteLinkedList(temp);
}

您的问题如下:

~LinkedListNode() { 
    if (next_ != nullptr) // LINE **
        delete next_;
}
假设你有一个链表5,4,3,2,1,你的头是5,你的下一个是4,3,依此类推。当你调用这个函数时,你要做的就是删除4,其他的一切都会留在你的系统中,你无法删除3,2,1等等,你删除了唯一指向它们的东西,你再也无法访问它们了。很多人都建议使用递归解决方案,老实说,如果在析构函数中使用它,那么它将不起作用。如果您真的想这样做,您将需要另一个类似这样的函数:

void deleteLinkedList(Node* head){
    if(head == nullptr)return;
    Node* temp = head->next;
    delete head;
    deleteLinkedList(temp);
}

但是
next
未设置为
nullptr
delete next下一步
空ptr
,则code>是安全的,无需检查该条件。您正在期待魔法。将
toDelete
设置为
nullptr
不会神奇地将任何其他指针设置为null。它当然不会将代码中的
thru
thru->next
设置为
nullptr
,也不会将任何
LinkdListNode
next
指针设置为
nullptr
,但您假设它会这样做。由于
toDelete
在设置为
nullptr
后立即停止存在,因此对
nullptr
的赋值没有任何用处。即使代码有效,对
LinkedListNode
使用递归析构函数也是非常糟糕的,尤其是对于大型列表。这是一个等待发生的堆栈溢出。递归循环不适用于链表,始终只使用迭代循环。如果要删除节点而不删除整个列表,该怎么办?当然,尝试让一个节点删除其他节点是个坏主意。但是
next\u
没有设置为
nullptr
delete next\u下一步
空ptr
,则code>是安全的,无需检查该条件。您正在期待魔法。将
toDelete
设置为
nullptr
不会神奇地将任何其他指针设置为null。它当然不会将代码中的
thru
thru->next
设置为
nullptr
,也不会将任何
LinkdListNode
next
指针设置为
nullptr
,但您假设它会这样做。由于
toDelete
在设置为
nullptr
后立即停止存在,因此对
nullptr
的赋值没有任何用处。即使代码有效,对
LinkedListNode
使用递归析构函数也是非常糟糕的,尤其是对于大型列表。这是一个等待发生的堆栈溢出。递归循环不适用于链表,始终只使用迭代循环。如果要删除节点而不删除整个列表,该怎么办?尝试让一个节点删除其他节点肯定不是一个好主意。看起来您需要交换两行-
head=
delete head
。顺便说一句,在这里使用递归不是一个好主意,尤其是这里的循环将非常容易。哎呀,我刚才写的东西将有内存泄漏…看起来你需要交换两行-
head=
删除head
。顺便说一句,在这里使用递归不是一个好主意,特别是这里的循环将非常容易。哎呀,我刚才写的东西将有内存泄漏。。。。