将指针设置为"nullptr"并不能防止双重删除?

Setting a pointer to `nullptr` doesn't prevent double deletes?

本文关键字:删除 并不能 指针 设置 nullptr      更新时间:2023-10-16

我有一个链表实现,其中有一个LinkedList类,该类包含一个名为head_的成员,该成员是指向LinkedListNode的指针。LinkedListNode显然包含一个名为next_的成员,我可以使用它来遍历列表。

我有一个析构函数~LinkedList,它从head_开始,在列表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_;
}

这给了我一个堆栈溢出错误,我猜这是因为我试图将deletenext_指针加倍,一次来自LinkedList,一次源自LinkedListNode

我的问题是:是否应该在第(*(行将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);
}