0

二分木データ構造を使用するプログラムを書いています。すべてのノードを解放するルーチンを書いているときに、説明できない奇妙な問題に遭遇しました。

これはルーチンです:

void destroy_tree(NodeT **tree){

    if( *tree != NULL ){
        destroy_tree( &(*tree)->left );
            free( (*tree)->left );
        destroy_tree( &(*tree)->right );
            free( (*tree)->right );
    }
    return;
}

基本的に、2 つ星のポインターが関数に渡されます。ポインターの解放に進む前に、各ノードが NULL かどうかをチェックします。NodeTNodeT 構造体への左右のポインターを含む構造体です。これらは私が解放しようとしているポインタです。

構造は次のように定義されます。

typedef struct{
    int val;
    struct tnode *right, *left;
}NodeT;

free() 呼び出しがなければ、期待どおりには何も起こりません。ただし、無料通話のコメントを外すと、出力は次のようになります。

ここに画像の説明を入力

プログラムを実行するたびにブロック数が変わりますが、最終的にはクラッシュして常に繰り返されます。

この関数への元の呼び出しは、あなたが期待するものです。

destroy_tree(&rootNode); 

rootNode の場所: NodeT *rootNode;

何か案は?

4

2 に答える 2

3

代わりに現在のノードを解放してみてください:

void destroy_tree(NodeT **tree){

    if( *tree != NULL ){
        destroy_tree( &(*tree)->left );
        destroy_tree( &(*tree)->right );
        free(*tree);
    }
    return;
}
于 2013-10-30T15:55:59.240 に答える