2013-01-07 54 views
1

我想學習C++,並且我有一個小的困惑。從C++中的鏈表中刪除一個節點

我從中學習的文本告訴我,如果要刪除const T&類型的節點,我應該先創建該節點類型的新指針,然後使用內置的C++ delete[]將其刪除。但是,如果我只是將待刪除節點的前一個元素設置爲要刪除的節點的下一個元素的鏈接,會發生什麼?例如:

*p = node.previous; 
p-> next = node.next; 

或者這會導致內存泄漏?

我很困惑,因爲我讀別的地方永遠,永遠刪除指針慎之又慎,但我一起工作的示例代碼,沿着線的東西:

Node<T> *p = node-to-be-deleted; 
delete p; 

什麼是最好的方式刪除節點?

回答

2

假設你的節點如下:

struct Node 
{ 
    Node* previous; 
    Node* next; 

    SomeType data; 
}; 

然後:

*p = node.previous; 
p-> next = node.next; 

然後YES。這會導致內存泄漏。
它也會讓p->next->prev指向錯誤的節點。

我很困惑,因爲我讀別的地方永遠,永遠刪除指針慎之又慎,但我一起工作的示例代碼,沿着線的東西:

是最好的方式是「永不刪除指針」。但是這必須結合一些背景。您不應該手動刪除指針,因爲指針應該由控制其壽命的對象來管理。這些對象中最簡單的是智能指針或容器。但是對於這種情況,這將是矯枉過正的(當你創建容器時)。當您創建容器(列表)時,您將需要自己進行管理(注意:C++已經有一些類型爲t或boost :: ptr_list的值列表的丟失類型std :: list, T的指針列表)。但嘗試自己做這件事是一個很好的練習。

這裏是一個初學者製作清單的代碼審查和它產生的註釋的例子:

http://codereview.stackexchange.comLinked list in C++

我希望這有助於在關於如何創建和刪除對象解釋。

1
Node* p = new Node; // This is how you allocate a node 
delete p; // This is how you delete it 

的刪除[]經營者應當在使用動態分配的陣列

Node* nodelist = new Node[ 4 ]; // nodelist is now a (dynamically allocated) array with 4 items. 
delete[] nodelist; // Will delete all 4 elements (which is actually just one chunk of memory) 
+0

那麼我的第一個實現,我只是取消引用它的指針會導致memleak? –

+0

是的,雖然你可能意思是'p',而不是'* p'。這是第一個響應谷歌搜索*鏈接列表示例C++ *:http://www.cprogramming.com/tutorial/lesson15.html只要繼續前進,挖掘到這種語言,祝你好運! –

+0

我這麼認爲...你能檢查我所做的修改嗎? –

0
void deleteNode(Node * p) 
{ 
    Node * temp = p->next; 
    p->data = p->next->data; 
    p->next = temp->next; 
    free(temp); 
} 

繼承人的東西我做了幾個月前。

template <class T> 
T LinkedList<T>::remove(int pos) 
{ 
    if (pos < 1 || pos > size) 
    { 
     throw pos; 
    } 
    ListNode * temp; 
    if (pos == 1) 
    { 
     temp=head; 
     head = head->next; 
    } 
    else 
    { 
     int i=1; 
     ListNode * prev = head; 

     while(i<pos-1) 
     { 
      i++; 
      prev=prev->next; 
     } 
     temp = prev->next; 

     prev->next = (prev->next)->next; 

    } 
    --size; 
    return temp->item; 
} 
+2

這是C++。假設他被分配了'new',然後**永遠不會**用'free'刪除,但是用'delete'刪除。 –

+0

@gustaf r:爲什麼? –

+0

@SwitwitJanwityanujit因爲**沒有**保證'malloc()'和'new'從同一個池中分配。它會導致*未定義的行爲*使用malloc + delete或new + free。 –

0

刪除Node直接纔有意義,如果Node實現析構函數來更新周邊Node實例的previousnext指針,例如:

Node::~Node() 
{ 
    if (previous) previous->next = next; 
    if (next) next->previous = previous; 
} 

Node *p = node-to-be-deleted; 
delete p; 

否則,您必須更新Node指針然後刪除Node問題,例如:

Node *p = node-to-be-deleted; 
if (p->previous) p->previous->next = p->next; 
if (p->next) p->next->previous = p->previous; 
delete p; 

這樣說,最好的方法是不要手動實施鏈接列表。在C++中,請使用std::list容器,並讓它爲您處理這些細節。