0

我需要使用一个特殊的库来跟踪我的内存泄漏位置malloc()= allocate( )free( ) = unallocate( ).

我正在尝试完成释放 alinked-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;

有人可以向我解释为什么第一种方法行不通吗?谢谢!:)

4

3 回答 3

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

在这里,您失去了根的一个元素。

于 2012-10-01T09:44:48.400 回答
0

1)

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

您是先制作 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); 
}
于 2012-10-01T09:45:27.797 回答
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 没有什么可以释放的。

于 2012-10-01T09:46:08.680 回答