[英]How do I properly delete nodes of linked list in C++
我覺得好像我實際上並沒有刪除該節點並釋放內存。 我想我只是在移動指針,所以當我打印鏈接列表時,列表不會打印我刪除的元素。 所以我的問題是我實際上是刪除節點還是只是簡單地重新排列指針,以使我看起來像是刪除節點(本質上只是斷開鏈接,而不是刪除節點)? 感謝您的任何幫助。
void SLL::deleteNode(int target){
Node *current = new Node;
Node *previous = new Node;
for (current = front->next, previous = front; current != NULL; current = current->next, previous=previous->next){
if (previous->data == target && previous == front){
front = previous->next;
delete[] previous;
return;
//This if statement deletes the element if its the front
}
else {
if (previous->data == target && previous->next == NULL){
previous = NULL;
delete[] current;
return;
//This if statement deletes the node if it is the back
}
else if (current->data==target)
{
previous->next = current->next;
delete[] current;
return;
//This if statement deletes a node if it is in the middle
}
}
}
delete[] current;
delete[] previous;
}
Node *current = new Node;
Node *previous = new Node;
此代碼會導致內存泄漏-您永遠不會刪除此內存。 您可以聲明沒有內存分配的指針:
Node *current = nullptr;
Node *previous = nullptr;
delete
將刪除指針的內存,因此您實際上將刪除Node。 但是對Node*
使用delete [] 是不正確的 ,它僅應用於數組-用new[]
分配的內存。 使用不當會導致不確定的行為。 因此,要正確刪除節點,請使用運算符delete刪除它們。
使用內存泄漏檢測工具可以知道程序中是否存在內存泄漏。
刪除列表元素的代碼:比如說,我們有pHead指向列表的頭部(但是如果您自己編寫此類內容,它會為您提供更多信息):
Node* pCur = pHead;
Node* pPrev = pCur;
while (pCur && pCur->data != target) {
pPrev = pCur;
pCur = pCur->next;
}
if (pCur==nullptr) // not found
return NOT_FOUND;
if (pCur == pHead) { // first element matches
pHead = pCur->next;
} else {
pPrev->next = pCur->next;
}
// pCur now is excluded from the list
delete pCur; // deallocate its memory
使用指針到指針的替代方法 (社區添加)
當你實際使用的指針列表中進行枚舉以上可以接受新的光。 下面從pp
開始,將頭指針(而不是它指向的節點;實際的指針本身) 的地址分配給pp
。 我們遍歷列表,直到pp
保留指向要刪除目標的節點的指針的地址(可以是頭指針,可以是某個節點中的next
指針,沒有區別)。 將要尋址的指針設置為其自己節點的next
值,然后刪除目標節點。
確實應該在調試器中觀察它的運行方式,但是鑒於實際情況,該算法非常簡單:
Node **pp = &pHead;
while (*pp && (*pp)->data != target)
pp = &(*pp)->next;
if (*pp)
{
Node *victim = *pp;
*pp = victim->next;
delete victim;
}
這就是全部 。 這樣一來,您就可以去除頭節點,而無需特殊情況下免費使用。 希望這也會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.