2016-09-21 82 views
0

當我刪除鏈接列表中的節點時,是否需要將next設置爲NULL?默認析構函數釋放成員指針指向的內存嗎?

的ListNode被定義爲這個

struct ListNode { 
    int val; 
    ListNode* next; 
    ListNode(int x): val(x) {} 
} 

現在我想m

ListNode *tmp = m->next; 
m->next = m->next->next; 
delete tmp; 

如果tmp->next將在析構函數被刪除後刪除節點,鏈表應該是遇到了麻煩。但是,如果tmp->next沒有被刪除,有可能是導致內存泄漏另一種情況:

ListNode *tmp = new ListNode(0); 
tmp->next = new ListNode(1); 
delete tmp; 

如果tmp->next不會被刪除,沒有辦法再次找到了這塊內存。

所以這是一個困境,默認的析構函數實際上做了什麼?

+0

它不會調用刪除成員指針 –

+0

默認析構函數可能知道是否釋放該內存?不能保證內存甚至是動態分配的。 – AnT

回答

1

默認的析構函數銷燬所有成員變量(它具有析構函數)並且什麼也不做。

沒有ListNode的成員變量具有析構函數,所以ListNode的默認析構函數什麼都不做。

請注意,雖然next是一個成員變量,但指向的東西next不是。

+0

那麼這是否意味着我應該刪除'tmp-> next'或在刪除'tmp'之前給它另一個指針? –

+0

@KingstonChan你已經有了你需要的信息來回答這個問題。你認爲它確實嗎? – immibis

+0

謝謝!你非常有幫助! –

0

所以這是一個兩難的問題,默認的析構函數實際上做了什麼?

默認析構函數銷燬成員變量。如果成員變量具有用戶定義的析構函數,則會調用它們。如果它們是基本類型,則什麼都不會發生

還有比我上面描述的更多。閱讀標準中關於析構函數的部分將是值得的。在C++ 11中,該部分是12.4。您還可以在cppreference.com找到更多信息。