Нужна ли очистка памяти в приведенном коде - C (СИ)
Формулировка задачи:
У меня есть структура следующего вида
Я динамически выделяю память на word. Нужно ли её потом очищать? Или хватит такой функции:
struct list {
char *word;
struct list *next;
};int free_list(struct list *free_list) {
struct list *temp;
while(free_list != NULL) {
temp = free_list -> next;;
free(free_list);
free_list = temp;
}
return 0;
}Решение задачи: «Нужна ли очистка памяти в приведенном коде»
textual
Листинг программы
...
void free_list(struct list * ls){
struct list * tmp;
while ( ls ){
tmp = ls->next;
if ( ls->word )
free(ls->word);
free(ls);
ls = tmp;
}
}
...
Объяснение кода листинга программы
- В данном коде реализован алгоритм очистки памяти, используемый для списка структур, содержащих указатели на следующие элементы списка (свойство
next). - Структура
listсодержит указатель на следующий элемент списка (next) и указатель на выделенную память (word). - В цикле
whileпроисходит обход всех элементов списка, начиная с первого. - В каждой итерации цикла:
- Перемещается указатель на следующий элемент списка (
tmp = ls->next). - Если в текущем элементе списка есть выделенная память (
if ( ls->word )), то она освобождается (free(ls->word);). - Освобождается память, выделенная под структуру
list(free(ls);). - Указатель на текущий элемент списка (
ls) обновляется на следующий элемент (ls = tmp).
- Перемещается указатель на следующий элемент списка (
- В итоге, после завершения цикла, все элементы списка и выделенная ими память будут освобождены.