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);

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

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

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

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

nsav ()

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

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

Dead ★★★★ ()
Ответ на: Re: освобождение связного списка от cavia_porcellus

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

1)

void FreeDev(struct devices * dev)
{

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

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

2)

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