【问题标题】:Freeing memory which has been allocated to an array of char pointers (strings). Do I have to free each string or just the "main" pointer?释放已分配给 char 指针(字符串)数组的内存。我必须释放每个字符串还是只释放“主”指针?
【发布时间】:2011-06-11 15:26:58
【问题描述】:

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

    /* ... */

}

【问题讨论】:

  • 你有内存泄漏:*(list + i) = some_string_from_somewhere 覆盖了从 malloc 获得的指针。
  • 这是一个很好的观点。您应该使用类似 strcpy/strncpy/other 的替代方法来复制字符串。我个人建议使用类似 snprintf 的东西,如果没有其他原因,它会迫使你评估你的假设。

标签: c memory pointers


【解决方案1】:

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

是的,确实。

如何彻底释放内存

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      只有您知道存在可以递归释放的树状结构,该知识不在 C 运行时堆中的任何位置,因此堆管理器对此一无所知,您的程序必须自行释放所有内容。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          • 2020-06-23
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 2017-04-12
          • 1970-01-01
          相关资源
          最近更新 更多