2011-01-19 23 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()。就这么简单。在其他任何情况下,你都会遇到内存泄漏。