我正在用 C 語言撰寫程式,并且在函式中使用了 malloc()。我必須在函式之后使用 free() 嗎?如果我不釋放它會導致記憶體泄漏,因為它只是一個函式嗎?
謝謝你。
void insertFirst(int key, int data) {
//create a link
struct node *link = (struct node*) malloc(sizeof(struct node));
link->key = key;
link->data = data;
//point it to old first node
link->next = head;
//point first to new first node
head = link;
}
uj5u.com熱心網友回復:
該函式將在函式內動態分配的節點添加到單鏈表中。
在該函式中,您不應釋放為節點分配的記憶體。否則串列將參考無效物件。
您需要撰寫一個函式,當不再需要串列時,該函式將釋放為串列分配的所有記憶體(節點)。
例如,該函式可以如下所示(考慮到head在串列的實作中將指標宣告為全域變數)
void clear( void )
{
while ( head != NULL )
{
struct node *tmp = head;
head = head->next;
free( tmp );
}
}
uj5u.com熱心網友回復:
一旦你的程式分配了記憶體,它就會一直保持分配狀態,直到你的程式釋放它。
通常,您不需要釋放記憶體。在通用的多用戶作業系統中,作業系統會在程式退出時釋放程式持有的所有資源。但是,在程式使用完畢后釋放記憶體通常是一種很好的做法。在重復執行各種操作的程式中尤其如此。如果在每次重復中,程式分配了記憶體但沒有釋放它,那么程式對記憶體的使用會隨著時間的推移而增長。這可能會干擾系統上運行的其他程式。
在簡單的學生程式中,除了診斷記憶體泄漏的工具抱怨之外,您不會觀察到因未能釋放一點記憶體而產生的任何不良影響。但是,這是您以后撰寫實用程式時必須學習的好習慣。
通常,分配記憶體的函式與釋放記憶體的函式配對。在最低級別,malloc分配記憶體并free釋放它。然后,在您將節點添加到鏈表的函式中,insertFirst將分配記憶體使用malloc并且不會釋放它,因為需要記憶體來將物件保存在鏈表中。相反,insertFirst將與一些從鏈表中洗掉節點的函式配對,該函式將呼叫free以釋放記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/338889.html
