2 способа освобождения памяти от простого связанного списка в C? - PullRequest
0 голосов
/ 21 марта 2012

* сильный текст * Я создал связанный список в C под названием lon с помощью следующих функций:

struct ilist_node {
   struct ilist_node * rest;
   int first;
};

typedef struct ilist_node *ilist;


ilist icons(int in, ilist il) {
   ilist r = malloc(sizeof(struct ilist_node));
   r->first = in;
   r->rest = il;
}

затем я увеличил список значками , чтобы создать список чисел

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

while (lon!= NULL) {
      ilist tmp = lon->rest;
      printf(" %d\n",lon->first);
      free(lon);
      lon = tmp;
   }

Я могу понять, почему эта функция выше работает. (Я гуглил, как освободить память, и этот, кажется, популярный ответ). Но из любопытства я попробовал другой:

   ilist tmp = lon;
   while (lon != NUll) {
      printf(" %d\n",lon->first);
      lon = lon->rest;
   }

   idelete(tmp);

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

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Пока я не вижу исходный код idelete, я не могу комментировать.Риск быть PITA, я не думаю, что кто-то может точно прокомментировать.

Нам нужен источник для idelete.

idelete может быть

void idelete(ilist il) {
   while (il!= NULL) {
      ilist tmp = il->rest;
      free(il);
      il = tmp;
   }
}

что бы нормально работать.

0 голосов
/ 21 марта 2012

Если idelete() реализует семантику, которую вы используете в первом примере (free() при переборе элементов списка), все должно быть освобождено. Поэтому, если idelete знает о типе ilist и способен вызывать free для внутренних элементов списка (передавая запись списка), у вас все в порядке, и утечки не произойдет.

Однако, если это не так, применимо мое первоначальное утверждение ниже (и другие ответы):


Второй буквально освободит только последний / первый элемент (в зависимости от того, как вы учитываете порядок элементов в связанном списке) - тот, который вы назначили с ilist tmp = lon вверху. Это работает, но утечка памяти.

Если это в Linux или в системе Unixoid, поддерживающей это, я настоятельно рекомендую проверить, что Valgrind с его инструментом по умолчанию memcheck говорит обо всем этом, так что вы, вероятно, узнаете что-то.

...