2013-11-20 50 views
0

這是結構:不能自由鏈表

typedef struct listeEle { 
    int pos; 
    struct listeEle *next; 
} ListEle; 

這是我創建列表:

ListEle *mokli(int n){ 
    if(n<=0) 
    { 
     fprintf(stderr, "Falscher Parameter für mokli... Programm beendet."); 
     exit(0); 
    } 
    else 
    { 
     ListEle *lst; 
     lst = malloc(sizeof(ListEle)); 
     lst->next = NULL; 
     lst->pos = 1; 
     int i; 
     ListEle *new; 
     ListEle *ptr; 
     ptr = lst; 

     for(i=1; i<n; i++) 
     { 
      new = NULL; 
      new = malloc(sizeof(ListEle)); 
      new->next = NULL; 
      new->pos = i+1; 
      ptr->next = new; 
      ptr = ptr->next; 
     } 
     return lst; 
    } 

} 

而這正是我試圖釋放它

void unmokli(ListEle *lst) 
{ 
    if(lst->next == NULL) 
    { 
     free(lst); 
     lst = NULL; 
     printList(lst); 
     printf("1 > Liste vollständig gelöscht.\n"); 
    } 
    else 
    { 
     ListEle *head; 
     head = lst; 

     int del = 0; 
     while(head) 
     { 
      ListEle *temp = head; 
      head = head->next; 
      free(temp); 

      del+=1; 
     } 
     free(lst); 
     lst = NULL; 

     printf("2 > Liste deleted (%d).\n", del); 
    } 

} 

這是我打印的方式

void printList(ListEle *anfang){ 
    if(anfang == NULL) 
    { 
     printf("List not av...\n"); 
    } 
    else 
    { 
     ListEle *ptr; 
     ptr = anfang; 
     int i = 1; 

     while(ptr) 
     { 
      printf("Element %i -> ListeEle pos=%i\n", i++, ptr->pos); 
      ptr = ptr->next; 
     } 
    } 

} 

問題在於主要方法。我在這裏創建的列表不會被釋放,儘管我將它正確地傳遞給釋放函數。

int main(void){ 

    ListEle *liste; 
    liste = mokli(6); 

    printList(liste); 
    unmokli(liste); 

    printList(liste); 

    return 0; 
} 

unmokli後它應該完全釋放,但主函數內的列表仍然分配。我怎樣才能完全免費的名單?

回答

1

當您在功能unmokli你只讓本地副本lstNULL

lst = NULL; 

。請記住參數是按值傳遞的,即它們被複制。你需要通過引用傳遞lst,這可以通過傳遞一個指針(指針)來完成:

unmokli(&liste); 
+0

的方法簽名必須保持這樣的。這是一項任務。 – IMX

+0

@IMX然後,你只需在'main'中設置'liste'指針爲'NULL',或者不再使用指針。當你釋放它指向的內容時使用指針會導致未定義的行爲。 –

+0

對,我會刪除我的評論。 –

0

要麼通:

void unmokli(ListEle **lst) 
{ 
    ... 
    *lst = NULL; 
    ... 
} 

然後,通過使用運營商的地址的調用此請參考listeunmokli(),或者從中取回參數。

在你的情況下,它被釋放,但變量listemain()沒有設置爲NULL,仍然引用舊的內存。這可能會導致你崩潰。

更新您的代碼

void unmokli(ListEle **lst_ref) 
{ 
    ListEle *lst = *lst_ref; 

    ... 
    //your code freeing list 

    //set to null after freeing 
    *lst_ref = NULL; 
} 

main()稱其爲

unmokli(&liste); 
0

它的釋放,但數據仍保留在調用free之後,所以你只要通過打印列表中刪除後,訪問已刪除的數據。 (實際上你不能這樣做) 另外,如果你想在自由函數裏面設置'liste'指向NULL,你應該把指針傳給一個指針。在unmokli下面的代碼是沒用的:

free(lst); // Already freed in a loop before 
lst = NULL; // Takes effect only inside this function 
0

通常情況下,我將釋放(& NULL分配)如下鏈接列表:

void unmokli(ListEle **lst) 
{ 
    ListEle* nxt; 
    if(lst==NULL) return; 
    // printList(*lst); // not required by the free-list logic as such... 
    while(*lst) 
    { 
     nxt=(*lst)->next; 
     // printList(*lst); // not required by the free-list logic as such... You can test free code with this. 
     free(*lst); 
     *lst=nxt; 
    } 
} 

//usage 
unmokli(&list_head);