释放已分配给char指针(字符串)数组的内存。 我是否必须释放每个字符串或只是“主”指针?

我有一个函数,它接受一个指向char **的指针并用字符串填充它(我想是一个字符串数组)。 * list_of_strings *在函数内部分配内存。

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 } /* ... */ } 

不会只是释放实际的指针而不是每个字符串本身使用的内存吗?

确实是的。

我如何完全释放内存

通过循环遍历数组并逐个释放每个字符串, 然后释放数组本身。 例如

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

基本上,分配和释放有一个经验法则:你需要调用尽可能多的free(),就像你调用malloc()一样。 就这么简单。 在其他每一种情况下,你都会遇到内存泄漏。

是的,您必须free()malloc()获得的每个块。 你可以通过遍历指针数组并在每个元素上调用free()然后释放数组本身来实现。

只有你知道有一个树状结构可以递归释放,知识不在C运行时堆中的任何地方,所以堆管理器不知道这一点,你的程序必须自己释放一切。

您需要迭代list并在每个数组成员上调用free() 。 然后释放arrays。