2009-12-11 1 views
1

Я использую двусвязный список в программе на языке C. Я запутался в освобождении памяти., не имеющий двойного перечня

  1. Должен ли я освобождать узел списка по узлу?
  2. Или, назначив головные и хвостовые узлы NULL?
+0

Пожалуйста, обратите внимание орфографии и форматирования. Этот сайт является более серьезным и требовательным в этом аспекте, чем «средний форум». – AttishOculus

+2

Кроме того, другие пользователи часто останавливаются и исправляют орфографию и форматирование. :) –

ответ

4

Вы должны освободить каждый узел. Если вы просто установите головной и хвостовой узлы в NULL, вы пропустите всю память, выделенную для списка.

8

Вы должны пройти список и освободить каждый узел. Если вы установите указатели на голову и хвост на NULL, узлы списка все еще находятся в куче, и у вас нет указателей на них, и это классическая утечка памяти.

Вот некоторые псевдокод:

Node* current = head; 
while(current != NULL) { 
    Node* next = current->Next; 
    free(current); 
    current = next; 
} 
// done 

Вы могли бы, конечно, траверсы для хвоста к голове - не делает каких-либо серьезных различий.

7

Если они были динамически распределены, вам нужно освободить узлы. Имейте в виду, что если ваши узлы содержат указатели на некоторые данные, и эти данные также были динамически распределены, вам также необходимо освободить их.

Что-то вроде:

list_node* node = head; 
while (node) 
{ 
    /* depends */ 
    /* free(node->data); */ 

    list_node* next = node->next; 
    free(node); 
    node = next; 
}