0

メモリ リークを追跡するには、特別なライブラリを使用する必要がmalloc()= allocate( )ありfree( ) = unallocate( )ます。

a の解放を完了しようとして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;

誰かが最初の方法が機能しない理由を説明できますか? ありがとう!:)

4

3 に答える 3

0

1)

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

最初に root=NULL を作成してから、 delete_commands を呼び出していますか?

2) 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
    }
}

更新について : 2 番目のバージョンは、何も割り当てないため動作します。したがって、thr は何も解放しません。

于 2012-10-01T09:46:08.680 に答える
0
Command_list *root = allocate(sizeof (Command_list));
    root = NULL;

ここでは、ルートの要素を 1 つ失っています。

于 2012-10-01T09:44:48.400 に答える