Нужно ли освобождать локальные переменные?

у меня есть следующие struct:

typedef struct cell Cell;
struct cell {
    int value;
    int *nextcell;
};

и у меня есть следующая функция для освобождения связанного списка:

void freelist(Cell *beginning)
{
    Cell *thisCell = beginning;
    Cell *NextCell = beginning->nextcell;

   while (thisCell != NULL)
   {
        NextCell = thisCell->nextcell;
        free(thisCell);
        thisCell = NextCell;
   }

   /* Here comes my question. Do I need to free the following variables? */
   free(beginnig);
   free(thisCell);
   free(NextCell);
}

2 ответов


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

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


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

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