我有一个函数,它接受一个指向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
}
/* ... */
}
答案 0 :(得分:16)
不会只释放实际指针而不释放每个字符串本身使用的内存吗?
是的,确实。
如何完全释放内存
通过循环遍历数组并逐个释放每个字符串,然后释放数组本身。 E.g。
for (i = 0; i < SOMETHING; i++) {
free(list[i]);
}
free(list);
答案 1 :(得分:6)
基本上,分配和释放有一个经验法则:你需要调用与你调用malloc()一样多的free()。就这么简单。在其他每一种情况下,你都会遇到内存泄漏。
答案 2 :(得分:4)
是的,您必须free()
从malloc()
获得的每个区块。你可以通过遍历指针数组并在每个元素上调用free()
,然后释放数组本身。
只有你知道有一个树状结构可以递归释放,知识不在C运行时堆中的任何地方,所以堆管理器不知道这一点,你的程序必须自己释放所有东西。
答案 3 :(得分:2)
您需要遍历list
并在每个阵列成员上调用free()
。然后释放阵列。