2011-01-19 24 views
4

我有一個函數,它需要一個指向char **的指針,並用字符串填充它(我猜想是一個字符串數組)。 * list_of_strings *在函數內部分配內存。釋放已分配給char指針(字符串)數組的內存。我是否必須釋放每個字符串或只是「主」指針?

char * *list_of_strings = NULL; 

/* list_of_strings malloc'd inside function */ 
fill_strings_with_stuff(&list_of strings); 

use_list_for_something(list_of_strings); 

/* Now how do I free it all? */ 

如何在使用字符串後釋放內存?如果我打電話

free(list_of_strings); 

不會只是釋放實際的指針,而不是每個字符串本身使用的內存?如何完全釋放內存

只是爲了清楚起見,功能看起來是這樣的:

fill_strings_with_stuff(char *** list) 
{ 
    *list = malloc(AMOUNT); 

    for (i = 0; i < SOMETHING; i++) { 
     *(list + i) = malloc(LINE_LEN); 
     *(list + i) = some_string_from_somewhere 
    } 

    /* ... */ 

} 
+3

你有內存泄漏:`*(list + i)= some_string_from_somewhere`覆蓋從malloc獲得的指針。 – sharptooth 2011-01-19 09:38:52

回答

2

是的,你必須每free()阻止你malloc()獲得。你可以通過遍歷指針數組並在每個元素上調用free(),然後釋放數組本身。

只有你知道有一個可以遞歸釋放的樹狀結構,知識不在C運行時堆中的任何地方,所以堆管理者對此毫不知情,而你的程序本身必須釋放所有東西。

15

不會只是釋放實際的指針而不是每個字符串本身使用的內存?

是的的確的。

我如何徹底釋放內存

通過一個之前通過數組循環和釋放每串一個釋放數組本身。例如。

for (i = 0; i < SOMETHING; i++) { 
    free(list[i]); 
} 
free(list); 
2

您需要迭代list並在每個陣列成員上調用free()。然後釋放陣列。

6

基本上,分配和釋放有一條經驗法則:您需要調用與您稱爲malloc()相同數量的free()。就這麼簡單。在其他任何情況下,你都會遇到內存泄漏。