删除链表中的头部不会导致内存泄漏吗?
Would not deleting the head in a linked list cause a memory leak?
我目前正在尝试为我的链表创建自己的析构函数 class,我知道我不能删除析构函数中的头部,因为 curr 在上面的代码中使用了它,但是删除头部不会导致我的代码内存泄漏吗?我什至需要将 head 设置为 null 吗?
~LinkedList(){//Destructor
Node*curr = head;
Node* next = nullptr;
while(curr->next != nullptr){
next = curr->next;
delete curr;
curr = next;
}
head = nullptr;
cout<<"Destructor called"<<endl;
}
while (head != nullptr) {
Node* curr = head;
head = head->next;
delete curr;
}
使它“复杂”的主要原因是 while 条件:它不应该在 next
字段上,这可能是空指针的原因。
那么你可以在next 和delete 之间进行指针操作,可以自由选择。
我发现操纵 head 立即使目的非常明确。
I know that I can't delete the head in the destructor because curr is using it in the code above
那么你所知道的是错误的,因为你可以并且必须释放head
节点,否则它会如果列表不为空则泄漏。仅仅因为 curr
指向 head
节点并不意味着您不能释放该节点。只是不要再使用该指针,直到您将其重新分配为指向不同的有效节点。
but would not deleting the head cause memory leaks in my code?
是的。
Do I even need to set head equal to null?
这不是严格需要的,不是。但它也没有任何伤害。由于被破坏的对象对外界来说实际上是死的,任何外部代码对它的进一步访问都是 未定义的行为,无论您是否将其 head
成员设置为 nullptr
与否。
也就是说,您显示的代码很好,除了 1 个小错误:
while(curr->next != nullptr)
需要改成这样:
while(curr != nullptr)
在您的原始代码中,如果列表为空,curr
将是 nullptr
,因此访问 curr->next
将是 未定义的行为 .如果列表不为空,循环将跳过释放列表中的 last 节点,其中 curr->next
将是 nullptr
.
正确的代码应该是这样的:
~LinkedList(){//Destructor
cout << "Destructor called" << endl;
Node *curr = head, *next;
while (curr != nullptr){
next = curr->next;
delete curr;
curr = next;
}
}
可以简化为:
~LinkedList(){//Destructor
cout << "Destructor called" << endl;
while (head){
Node *next = head->next;
delete head;
head = next;
}
}
我目前正在尝试为我的链表创建自己的析构函数 class,我知道我不能删除析构函数中的头部,因为 curr 在上面的代码中使用了它,但是删除头部不会导致我的代码内存泄漏吗?我什至需要将 head 设置为 null 吗?
~LinkedList(){//Destructor
Node*curr = head;
Node* next = nullptr;
while(curr->next != nullptr){
next = curr->next;
delete curr;
curr = next;
}
head = nullptr;
cout<<"Destructor called"<<endl;
}
while (head != nullptr) {
Node* curr = head;
head = head->next;
delete curr;
}
使它“复杂”的主要原因是 while 条件:它不应该在 next
字段上,这可能是空指针的原因。
那么你可以在next 和delete 之间进行指针操作,可以自由选择。
我发现操纵 head 立即使目的非常明确。
I know that I can't delete the head in the destructor because curr is using it in the code above
那么你所知道的是错误的,因为你可以并且必须释放head
节点,否则它会如果列表不为空则泄漏。仅仅因为 curr
指向 head
节点并不意味着您不能释放该节点。只是不要再使用该指针,直到您将其重新分配为指向不同的有效节点。
but would not deleting the head cause memory leaks in my code?
是的。
Do I even need to set head equal to null?
这不是严格需要的,不是。但它也没有任何伤害。由于被破坏的对象对外界来说实际上是死的,任何外部代码对它的进一步访问都是 未定义的行为,无论您是否将其 head
成员设置为 nullptr
与否。
也就是说,您显示的代码很好,除了 1 个小错误:
while(curr->next != nullptr)
需要改成这样:
while(curr != nullptr)
在您的原始代码中,如果列表为空,curr
将是 nullptr
,因此访问 curr->next
将是 未定义的行为 .如果列表不为空,循环将跳过释放列表中的 last 节点,其中 curr->next
将是 nullptr
.
正确的代码应该是这样的:
~LinkedList(){//Destructor
cout << "Destructor called" << endl;
Node *curr = head, *next;
while (curr != nullptr){
next = curr->next;
delete curr;
curr = next;
}
}
可以简化为:
~LinkedList(){//Destructor
cout << "Destructor called" << endl;
while (head){
Node *next = head->next;
delete head;
head = next;
}
}