LINUX.ORG.RU

освобождение связного списка


0

0

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

struct devices

{ /* какие-то поля */

struct devices *next;

} *start = NULL; потом этот список заполняется

а потом делаем так:

void FreeDev(struct devices * dev)

{

if (dev->next)

{

FreeDev(dev->next);

}

free(dev);

dev=NULL;

return;

}

......

if (start)

FreeDev(start);

По всей видимости, здесь что-то не так =(

По-моему правильно, но циклом было бы эффективней чем нехвостовой рекурсией. И ненамного сложнее.

А с чего ты взяла, что здесь что-то не так?

nsav
()

можно так например
void FreeDev(struct devices * dev) {
    struct devices *temp;
    while(dev) {
      temp = dev->next;
      free(dev);
      dev=temp;
    }
}

Dead ★★★★
()
Ответ на: комментарий от cavia_porcellus

1)

void FreeDev(struct devices * dev)
{

   if (dev->next)
   {
      FreeDev(dev->next);
   }
   free(dev);
   dev=NULL; /* В этом месте присваивается
                значение параметру, т.е. фактически
                локальной переменной, которое
                будет потеряно при выходе из функции */
} 

Не уверен, что причина утечки именно в этом (всего кода не вижу),
но очень вероятно.

2)

kosmonavt
()
Ответ на: комментарий от kosmonavt

2)

Не используй рекурсию - на достаточно большом списке можешь вылететь из стека.

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.