2009-11-27 112 views
2

我是C初學者,我正在編寫一個非常簡單的鏈接列表。我想知道是否會有下面的代碼中的內存泄漏:內存泄漏C

void removeListEntry(struct tableEntry *symp, struct tableEntry *previous) { 
    if (symp->next = 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
    } else { 
    previous->next = symp->next; 
    symp->next = 0; 
    } 
} 

我敢肯定,如果指針SYMP沒有存儲在另一個變量,沒有訪問該指出由列表條目的方式指針,所以我會有內存泄漏。 在C中,我們使用malloc()函數爲數據結構分配內存空間,並且我記得使用new關鍵字來動態地在C++中分配內存。使用malloc()分配內存和使用new有什麼區別?我的代碼中確實存在內存泄漏?

回答

1

我很好奇什麼是應該在你的代碼中發生的事情:

if (symp->next = 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
} else { 
    previous->next = symp->next; 
    symp->next = 0; 
} 

何時symb->next不是零?如果symb爲空,那麼您不會執行任何操作,因爲頭節點也將爲空。

混亂的部分是你在第一個附加previoussymb如果(這應該總是這樣),但在接下來的一個要附加到symbprevious。第二個理論基礎是什麼,在什麼情況下會發生?因爲在C/C++中沒有垃圾收集器,所以每個要釋放的節點都需要被釋放,如果你分配內存需要釋放內存,否則你有內存泄漏。 。

symb->next = 0可能只是一個錯字,正如指出的那樣,因爲這將永遠是真實的,並且是一個常見的錯誤。我開始做什麼來幫助解決這個問題是: if (0 == symb->next),所以如果你做了0=symb->next那麼你會得到一個編譯器錯誤。

UPDATE:

正如指出的評論,此功能會經常去'別人的條款,可預期的行爲,其實。

+0

symb->未來= 0值總是假的,而不是真實的。 – 2009-11-27 07:49:52

+0

你是對的,我沒有想到下一個設置爲零後會發生什麼。 – 2009-11-27 14:47:49

1

一旦您完成使用由malloc()分配的內存,您需要致電free()

5
if (symp->next = 0) { 

此,如果 - 「條件」 是一個賦值,設置symp->next0。如果指向另一個對象的指針存儲在symp->next中,則該對象將丟失,並且對象內存不會被釋放。

對於需要使用==,而不是一個對比:

if (symp->next == 0) { 

或者做沒有一個明確的對比:

if (!symp->next) { 

else情況下,你從列表中刪除symp(假設previous實際上包含symp之前的元素),但是你不釋放它的內存。這可能是內存泄漏,但它取決於調用該函數的代碼:該代碼可能仍然釋放symp或對已刪除的元素執行其他操作,或者可能會忘記它並泄漏內存。

0

正如上面指出的if(symp->next = 0)是一個賦值操作,if語句將計算爲false。因此,您不僅會丟失指向symp後面的下一個表項的指針,而且還會丟失上一個 - >下一個指針(我假設它指向symp?)。

的風格早晚的事情,但我個人會重寫功能更是這樣的:

void removeNextListEntry(struct tableEntry *previous) { 
    struct tableEntry *dummy = previous->next; 
    if (dummy->next == 0){ 
    symbolList.tail = previous; 
    previous->next =0; 
    } else { 
    previous->next = dummy->next; 
    } 
    free(dummy); 
}