2012-03-20 55 views
0

* 強大的文本 *我創建了一個鏈表用C稱爲結腸與以下功能的幫助:在C中釋放一個簡單鏈表的內存的兩種方法?

struct ilist_node { 
    struct ilist_node * rest; 
    int first; 
}; 

typedef struct ilist_node *ilist; 


ilist icons(int in, ilist il) { 
    ilist r = malloc(sizeof(struct ilist_node)); 
    r->first = in; 
    r->rest = il; 
} 

然後我增加與圖標列表創建號碼列表

在那之後,我試圖通過

while (lon!= NULL) { 
     ilist tmp = lon->rest; 
     printf(" %d\n",lon->first); 
     free(lon); 
     lon = tmp; 
    } 

我可以理解W¯¯打印每個元素的列表,並釋放被列表使用的內存上面這個函數起作用。 (我搜索瞭如何釋放內存,這似乎是受歡迎的答案)。但出於好奇,我試了另一個:

ilist tmp = lon; 
    while (lon != NUll) { 
     printf(" %d\n",lon->first); 
     lon = lon->rest; 
    } 

    idelete(tmp); 

它也有效。所以我有點困惑。如果最後一個工作正常,那麼爲什麼我需要通過列表並釋放每個節點?

+0

目前尚不清楚您是否想要評論循環列表或釋放其空間。如果我認爲idelete真的是我們需要比較的,那麼請張貼idelete的來源 – gbulmer 2012-03-20 21:36:38

+0

ahhh謝謝。它是因爲我使用由我的教授給予的idelete而不是內置的刪除。愚蠢的錯誤 – x7qiu 2012-03-20 21:41:04

+0

與往常一樣,問這個問題有幫助! - ) – gbulmer 2012-03-20 21:56:30

回答

2

直到我看到idelete的源代碼,我無法發表評論。 冒着成爲PITA的風險,我認爲任何人都無法準確評論。

我們需要idelete的來源。

idelete可能

void idelete(ilist il) { 
    while (il!= NULL) { 
     ilist tmp = il->rest; 
     free(il); 
     il = tmp; 
    } 
} 

這將很好地工作。

0

idelete()如果idelete()實現您在第一個示例中使用的語義(在遍歷列表元素時使用free() ing),則應該釋放所有內容。因此,如果idelete知道ilist類型,並且能夠在內部爲列表元素調用free(通過列表條目),那麼您很好,並且不會發生泄漏。

然而,如果不是這種情況我原來的語句下面(以及其他的答案)適用於:


第二個將字面上僅釋放最後一個/第一個元素(這取決於你如何考慮的順序鏈接列表中的元素) - 您在頂部分配ilist tmp = lon的那個元素。它可以工作,但會泄漏一些內存。

如果這是在Linux或支持它的unixoid系統上,我強烈建議查看Valgrind的默認工具memcheck是怎麼說的,因此您可能會學到一些東西。