2013-09-28 3 views
7

У меня есть следующие 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); 
} 
+6

Вы не являетесь свободными переменными, вы освобождаете память. Правило большого пальца: один свободный на malloc (или realloc). –

ответ

7

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

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

+0

Thks man, который отвечает на мой вопрос! =) –

+0

Лучший способ проверить, верно ли это, - попробовать применить free() к переменной, хранящейся в стеке, и посмотреть, что произойдет. :) – rbaleksandar

2

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

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

Смежные вопросы