2015-10-10 23 views
4

這似乎是一個愚蠢的問題,但我想問的原因是因爲我有這樣的析構函數:我可以在其析構函數中使用其頭節點遍歷鏈表嗎?

list::~list() 
{ 
    for (node* next = headByName->nextByName; headByName; headByName = next) 
    { 
     delete headByName; 
    } 
} 

和Valgrind的還是說我有內存泄漏。所以我想我真正的問題是:我的析構函數編碼是錯誤的,還是通過遍歷它的頭節點來銷燬列表是不好的?

+1

該代碼被破壞! –

+2

@CaptainObvlious XD我想我可以看到你爲什麼有這麼多的聲譽。 – Larrimus

+0

你在看什麼用戶檔案?我有信譽的傑克。 –

回答

3

你的代碼沒有做正確的事情。

  1. 你永遠不會改變next,所以headByName不會在第一次迭代後更改。
  2. 如果在循環開始之前headByName爲nullptr,那麼您在初始化中取消引用nullptr。

試試這個:

list::~list() 
{ 
    while (headByName) 
    { 
     node* next = headByName->nextByName; 
     delete headByName; 
     headByName = next; 
    } 
} 
+1

我被告知儘可能使用'for'循環。我想這不是'for'循環的地方。 – Larrimus

3

既然你評論一下for循環的偏好,是對粉絲,我用它只要有可能,我還想寫這可怎麼與實現for循環:

for(node* next; headByName; headByName = next) 
{ next = headByName->nextByName; 
    delete headByName; 
} 
+2

這會比@ronalchn的while循環效率低嗎? – Larrimus

+2

@Larrimus這是同樣的表現明智,相同的陳述順序,但寫法不同。我喜歡使用for循環,因爲它們使代碼更短。上面的代碼甚至可以寫完整的一行,但我不想寫「陌生」,可能是不推薦的東西:) –

+2

我很抱歉,我不能給你+15聲望,通過標記你的解決方案作爲正確的答案,但有一個upvote。謝謝! – Larrimus

相關問題