2013-09-28 55 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

這個男人,這回答我的問題! =) –

+0

檢查這是否爲真的最佳方法是嘗試將free()應用於存儲在堆棧上的變量並查看會發生什麼。 :) – rbaleksandar

2

無論指針存儲在哪裏,您都可以釋放內存 - 在局部變量中,在全局/靜態變量中,或者在免費存儲區本身分配的指針中。你的函數可以多次釋放幾個指針:你不需要在你的函數底部釋放三個調用中的任何一個(儘管第二個調用是無害的,因爲它傳遞NULL來釋放,這總是OK)。

相關問題