2013-09-28 31 views
7

Mam następujący struct:Czy muszę zwolnić lokalne zmienne?

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

I mam następującą funkcję do bezpłatnej połączonej listy:

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

Nie wyzwolisz zmiennych, zwolnisz pamięć. Praktyczna zasada: jeden darmowy za malloc (lub realloc). –

Odpowiedz

7

Nie, uwolnienie jest przeznaczony do dynamicznie przydzielonej pamięci, wskaźnik jest tylko zmienna, która tam wskazuje. Twoja pętla zwalnia całą pamięć, którą zajęła lista - w tym momencie nie ma nic do uwolnienia i próba zwolnienia tej samej pamięci ponownie (na początku) spowodowałaby błąd. thisCell po pętli jest NULL tam nie ma nawet coś do uwolnienia.

Jeśli chodziło o same wskaźniki, nie przydzielono pamięci dynamicznie, gdy je zdefiniowano, każdy z nich wziął szczelinę na stosie, a pozostawienie tej funkcji spowodowałoby zwolnienie tego gniazda. Tutaj mówimy tylko o samych wskaźnikach (miejscu, w którym zapisywany jest ich adres), a nie o spiczastej pamięci, którą mogą pomieścić.

+0

Thks man, który odpowiada na moje pytanie! =) –

+0

Najlepszym sposobem sprawdzenia, czy to prawda, jest próba zastosowania metody free() dla zmiennej przechowywanej na stosie i zobacz, co się stanie. :) – rbaleksandar

2

Wolna pamięć, którą można przydzielić bez względu na miejsce przechowywania wskaźnika - w zmiennej lokalnej, w zmiennej globalnej/statycznej lub w wskaźniku przydzielonym w samym wolnym magazynie.

Twoja funkcja kilkakrotnie zwalnia kilka wskaźników: nie potrzebujesz żadnego z trzech połączeń, aby zwolnić u dołu swojej funkcji (chociaż drugie połączenie jest nieszkodliwe, ponieważ przechodzi NULL na darmo, co zawsze jest OK).