2012-10-01 112 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); 
}