Освобождение памяти, которая была выделена массиву указателей на символы (строки). Нужно ли освобождать каждую строку или только «основной» указатель? - PullRequest
7 голосов
/ 19 января 2011

У меня есть функция, которая берет указатель на символ ** и заполняет его строками (массив строк, я думаю). * 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 ]

16 голосов
/ 19 января 2011

Разве это не освобождает фактические указатели, а не память, которую использовала каждая строка?

Да, действительно.

Как мне полностью освободить память

Зацикливая массив и освобождая каждую строку одну за другой до освобождения самого массива. Э.Г.

for (i = 0; i < SOMETHING; i++) {
    free(list[i]);
}
free(list);
6 голосов
/ 19 января 2011

По сути, есть практическое правило выделения и освобождения: вам нужно вызвать столько free (), сколько вы вызвали malloc ().Это так просто.В любом другом случае вы получили утечку памяти.

4 голосов
/ 19 января 2011

Да, вам нужно free() каждый блок, который вы получили от malloc(). Вы делаете это, обходя массив указателей и вызывая free() для каждого элемента и только затем освобождая сам массив.

Только вы знаете, что существует древовидная структура, которая может быть рекурсивно освобождена, что знания нет нигде в куче времени выполнения C, поэтому менеджер кучи не имеет об этом никакого представления, и ваша программа должна сама все освободить. *

2 голосов
/ 19 января 2011

Вам нужно перебрать list и вызвать free() для каждого члена массива. Затем освободите массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...