2013-04-29 40 views
-1

我想刪除鏈接列表中的所有元素。 我使用了下面的代碼,它看起來好像符合./a.out, 但是,當我使用valgrind ./a.out時,它說有內存錯誤。 你能幫我解決這個問題嗎? 謝謝!從開始刪除鏈接列表 - 內存錯誤

void List::emptyTheList() 

if (head==NULL) 
{ 
    cout<<"there is no elements in the list" <<endl; 

} 

else 
{ 
DR *temp1;//DR is a class 
temp1=head->getNext(); 
while(temp1!=NULL) 
{ 
    free(head); 
    head=temp1; 
    temp1=head->getNext(); 
} 

} 
+4

該代碼沒有正確縮進,也不會編譯。 (這個方法沒有開頭的括號。)你能解決這些問題嗎?然後我們會很好的回答這個問題。 – sigpwned 2013-04-29 02:27:04

+0

另外,「列表中沒有元素」應該閱讀「列表中沒有元素」,如果您希望語法正確 Ozraptor 2013-04-29 02:30:01

+0

就代碼的邏輯流程而言,它看起來像我從來沒有釋放列表中的最後一個元素?當'head'被分配給列表的最後一個元素時,temp1可能會被'head-> getNext()'設置爲null,這會在釋放最後一個元素之前導致while循環退出)。這可能是Valgrind抱怨的內存泄漏/問題。當您按照sigpwned的要求提供適當的代碼示例時,可以確認。 – Ozraptor 2013-04-29 02:39:12

回答

0

您的代碼似乎在刪除部分有問題。 「而」循環結束後

free(head); 

:你爲什麼不試試這個:

temp1=head; 
while(temp1!=NULL) 
{ 
    head=temp1; 
    temp1=temp1->next; 
    free(head); 
} 
0

按我的意見,你可以簡單地通過增加線解決問題。還有更好的方法來重新構建這些代碼。

0

要解決問題,請考慮只有一個節點的情況。 它永遠不會被釋放,因爲循環永遠不會被輸入。

如果您的代碼已經過靜態測試(或者您已經自行審查過,您可能會在Valgrind之前發現問題)。

通常,最後的節點永遠不會被釋放。

這是問題的原因。

1

爲什麼我似乎在這個問題上具有與正在使用malloc()free()的存儲器分配的C++鏈表的嚴重問題的唯一的人?顯然對象類DR具有成員函數。有可能它有一個構造函數和一個析構函數。

關於你的算法來清除前進鏈接列表,這樣做的標準算法是這樣的:

while (head) 
{ 
    DR *temp1 = head; 
    head = head->getNext(); 
    delete temp1; 
} 

此,假設你正確使用C++ operator new(你應該是)的分配。如果你沒有,開始這樣做的話,否則構造函數都不會被解構器正確地解僱。如果您分配的代碼如下所示:

DR *node = (DR *)malloc(sizeofDR)); 

或類似的東西,停止。代之以:

DR *node = new DR(constructor parameters here).