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

cae*_*ius 7 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? */
Run Code Online (Sandbox Code Playgroud)

在使用琴弦后,我将如何释放内存?如果我打电话

free(list_of_strings);
Run Code Online (Sandbox Code Playgroud)

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

为了清楚起见,该函数看起来像这样:

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
    }

    /* ... */

}
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 16

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

确实是的.

我如何完全释放内存

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

for (i = 0; i < SOMETHING; i++) {
    free(list[i]);
}
free(list);
Run Code Online (Sandbox Code Playgroud)


0xC*_*ABE 6

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


sha*_*oth 4

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

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