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

У меня есть функция, которая принимает указатель на 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 } /* ... */ } 

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

Да, в самом деле.

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

Путем прокрутки массива и освобождения каждой строки один за другим, прежде чем освободить сам массив. Например

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

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

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

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

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