2013-10-21 81 views
0

我已經在一個函數中創建了一個鏈表,並且我正在使用一個指針訪問這個列表的其餘部分。現在我如何在程序結束時釋放這個鏈表?我是否明確使用free(CircuitData)還是必須通過列表釋放每個節點?寫這個我想在釋放每個節點是明顯的答案...如何釋放鏈表?

在旁邊說明我也想問問如何找出在程序中分配的所有內存是否正確釋放?

ListNodeType *CircuitData; 
CircuitData = NULL; 
ReadFile(&CircuitData, &numEl, &numNodes); 


void ReadFile(ListNodeType **CircuitData, int *numEl, int *numNodes){ 

    ListNodeType *newPtr, *tempPtr; 
    newPtr = malloc(sizeof(ListNodeType)); 
    *CircuitData = newPtr; 
    newPtr->nextPtr = NULL; 

    //MORE CODE 
+1

關於第一個問題的基礎上,你的分配片段,釋放每個節點。實際上它取決於列表如何分配(顯然)。一些鏈接列表是在一個靜態緩衝區中完成的,但你的確看起來遵循規則而不是例外。 – WhozCraig

回答

1

malloc您將需要一個free否則將導致內存泄漏。分析程序以查看是否沒有內存泄漏的一種可能方法是使用Valgrind

1

對於你的第一個問題,是的,你應該走的清單和free每個節點。

第二個問題有點難以回答。如果你在內存中有一個對象,但沒有辦法訪問它,那就是內存泄漏。

有些工具可以用來分析你的內存池。檢查出的valgrind:

http://valgrind.org/

2

我認爲你可以做這樣的事情:

void freeFunction(ListNodeType *CircuitData) 
{ 
    void *victim; 

    while (CircuitData) 
    { 
     victim = CircuitData; 
     CircuitData = CircuitData->next; 
     free(victim); 
    } 
} 
+1

雖然你不需要'tmp',這是準確的。只需走'CircuitData'即可。無論如何,當你摧毀它所指向的一切時,沒有理由保留它的原始價值。如果正確完成,最後一個if子句是不需要的。 – WhozCraig

+0

沒錯'tmp'是無用的,但我把它僅適用於理解;) – lobodart

+1

書面它將雙free()的最後一個節點,更糟的是,free()的一個不確定的(讀:無效)的指針,如果在列表中傳遞是空的。最後的「if」塊應該不存在。 **編輯:**必須解決它,這是錯誤的,並出於某種原因,無論收到增票。 – WhozCraig

6

我想的是這樣的:

struct node 
{ 
    int data; 
    node* next; 
} *head; 

void deleteAllNodes(node* start) 
{ 
    while (start != NULL) 
    { 
     node* temp = start; 
     start = start -> next; 
     free(temp); 
    } 
} 
+1

刪除是一個C++構建,而不是C – clcto

+0

哎呀,對不起!更新了代碼。 – Preethi

+1

在我們繼續下一個項目之後,不免費必須去嗎? – User