2016-03-01 33 views
1

我有一個函數可以計算鏈表的大小。在返回之前的行被排除temp=NULL而我只有free(temp)時,我得到了「double free or corruption」編譯錯誤。當我在free(temp)之前添加temp=NULL時,代碼起作用。計算列表大小,是否需要使用free()?

因爲編譯器釋放了temp及其鏈接的節點,我得到了一個雙重釋放或損壞? temp=NULL解決了嗎?

最終,是否有必要使用free()這個小功能?

typedef struct node{ 
    int a, b; 
    struct node *next; 
}Node; 

typedef struct list{ 
    Node* head; 
    Node* tail; 
}List; 

int list_size(List *q){ 
    Node *temp; 
    int i = 1; 
    if(q->tail == NULL && q->head == NULL){ 
     return 0; 
    } 
    else{ 
     temp = q->head; 
     while(temp->next != NULL){ 
      temp = temp->next; 
      ++i; 
     } 
     temp = NULL; 
     free(temp); 
     return i; 
    } 
} 
+0

在'free(temp)'「工作之前添加'temp = NUL'L,因爲在這種情況下,你的免費歸結爲'free(NULL)',它什麼都不做。 –

+3

順便說一句當你只是想要計算元素的數量時,爲什麼你釋放列表中的元素? –

+0

@MichaelWalz - 我認爲有必要釋放溫度 - 但現在清楚了,'temp'沒有分配任何內存。 – JJL

回答

5

您沒有分配任何內存,所以您不需要釋放任何內存。任何方式,如果你分配內存,你需要釋放它。

需要釋放的內存是動態分配的內存。動態分配內存的功能在文檔中免費列出:http://en.cppreference.com/w/c/memory/free

2

作爲一種正確的編程技術,無論我們正在討論的內存量多少,您都應該動態分配的內存爲free()。 但是,在這裏您沒有爲temp分配任何內存。因此,你的問題解決了,因爲你將temp設置爲NULL,並且實際上釋放了NULL,這不會影響你的程序。