2012-10-01 148 views
0

我需要使用一個特殊的庫來跟蹤我的內存泄漏,其中malloc()= allocate()free() = unallocate()免費()指針

我試圖完成免費的linked-list,但它似乎沒有被釋放的「根」值。

typedef struct _node { 
    struct _node *child; 
    char *command; 
} Command_list; 

void delete_commands(Command_list **root) 
{ 
    Command_list *temp; 
    while(*root != NULL){ 
     temp = (*root)->child; 
     //printf("STRING: %s\n", *root->command); 
     unallocate(*root); 
     *root = temp; 

    } 
} 

是調用它的功能

void file_processing(....){ 
    Command_list *root = allocate(sizeof (Command_list)); 
    root = NULL; 
.... 
     delete_commands(&root); 
    } 
} 

我相信

Command_list *root = allocate(sizeof (Command_list)) 

沒有被正確地去分配出於某種原因。 任何人都可以給我一些提示?

更新:我發現的,而不是

Command_list *root = allocate(sizeof (Command_list)); 
     root = NULL; 

,這個作品:

Command_list *root = NULL; 

有人能向我解釋爲什麼第一種方法不行?謝謝! :)

+0

儘管您可以省略,但'''部分中可能存在錯誤。 – avakar

+0

可以肯定的是,代碼之間沒有任何問題,因爲不同的嘗試似乎已經解決了這個問題。 – rlhh

+0

我不關注。爲什麼剛剛在分配內存之後設置'root = NULL'? –

回答

0

我會做這樣的事情:

void delete_commands(Command_list *root) // Pass the pointer, not the pointer's address 
{ 
    Command_list *temp; 
    while(root != NULL) 
    { 
     temp = root->child; 
     //printf("STRING: %s\n", *root->command); 
     unallocate(root); 
     root = temp; 
    } 
} 

void file_processing(....){ 
    Command_list *root = allocate(sizeof (Command_list)); 
    root = NULL; // ERROR : you lost the pointer, you probably mean to null the command and child node 
    root->command = NULL; 
    root->child = NULL; 
.... 
     delete_commands(root); // Pass the pointer, not the pointer's address 
     root = NULL; // Now everything is freed, you can nullify this pointer 
    } 
} 

關於更新: 第二個版本的作品,因爲你不分配任何東西,所以THR是什麼自由。

0
Command_list *root = allocate(sizeof (Command_list)); 
    root = NULL; 

在這裏你失去了一個根元素。

0

1)

void file_processing(....){ 
    Command_list *root = allocate(sizeof (Command_list)); 
    root = NULL; 
    ... 
    delete_commands(&root); 

你先使根= NULL,然後調用delete_commands? 2)delete_commands()不釋放根節點[第一個節點],但它釋放除第一個節點以外的所有節點,因此,可能可以在delete_commands中添加以下內容。

void delete_commands(Command_list **root) 
{ 
    Command_list *temp; 
    Command_list *FirstNode= NULL; 
    FistNode = *root; 
    while(*root != NULL){ 
     temp = (*root)->child; 
     //printf("STRING: %s\n", *root->command); 
     unallocate(*root); 
     *root = temp; 

    } 
    if (*FirstNode != NULL) unallocate(*FirstNode); 
}