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
。顺便说一句,在这里使用递归不是一个好主意,特别是这里的循环将非常容易。哎呀,我刚才写的东西将有内存泄漏。。。。