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

时间:2011-01-19 09:34:56

标签: c memory pointers

我有一个函数,它接受一个指向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
    }

    /* ... */

}

4 个答案:

答案 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()。然后释放阵列。