Нужно ли освобождать локальные переменные?
у меня есть следующие 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, что всегда нормально).