2016-10-13 9 views
0

私は木を実装するCプログラムを持っています。私のクリーンアップ機能は、次のようになります。私のツリー構造体は、私はこのようなツリーを初期化しています関数からメモリを解放できません

typedef struct TreeNode_st { 
    char *word;     // the word held in this node 
    unsigned int frequency;  // how many times it has been seen 
    struct TreeNode_st *left;  // node's left child 
    struct TreeNode_st *right; // node's right child 
} TreeNode; 

あり

void cleanup_tree(TreeNode* root){ 
     printf("Called\n"); 
     if(root->left!=NULL){ 
       cleanup_tree(root->left); 

     } 

     if(root->right!= NULL){ 
       cleanup_tree(root->right); 
     } 

     if(root->right==NULL &&root->left==NULL) { 
       /*free(root);*/ 
       free(root->word); 
       free(root); 
       root = NULL; 
     } 

} 

:私のmain

TreeNode* initTreeNode(){ 
     TreeNode *mainNode=  (TreeNode*)malloc(sizeof(TreeNode)); 
     mainNode->frequency = 0 ; 
     mainNode->word = NULL; 
     mainNode->left = NULL; 
     mainNode->right = NULL; 
     return mainNode; 

} 

、私は

呼ばれています
TreeNode *mainNode =initTreeNode(); 

と私は私のcleanup_tree行の下
printf("~~~FINAL NULL TEST %s",mainNode->left->right->word); 、 を入れて、私はそれに作業をやっている、とだけプログラム終了前に、私はValgrindのは、これだけテストするために、メモリリークを報告

cleanup_tree(mainNode); 

、私は をしたと呼ばれます私は今でもその言葉を見ることができます。

私は間違っていますか?

+0

{if(root-> right == NULL && root-> left == NULL){'子ノードを持たないノードのみを解放しますか? –

+0

私はその関数を再帰的に呼び出していますので、その変数を自由に設定する必要があります。親が子を持たないノードになり、ルートに移動します。 –

+0

変数は自分自身を魔法に設定しませんしかし、NULLにする。 – tkausl

答えて

1

2つの方法があります。

  1. あなたはそれをポインタツーポインタを渡します。void cleanup_tree(TreeNode **root)
  2. あなたはクリーンアップが戻った後NULLにフィールドを設定します。

は、現在、関数によって加えられた変更は、渡されたノード・パラメーターに反映されません。

広告2:

cleanup_tree(root->right); 
root->right= NULL; 
0

あなたは第三ifブロックが呼び出されるように、この関数の最後にroot = NULLを設定すると、呼び出し元の関数に見えるようになるという印象の下にあるように見えます。そうではありません。

free()wordとノード自体が常に必要です。

void cleanup_tree(TreeNode* root){ 
     printf("Called\n"); 
     if(root->left!=NULL){ 
       cleanup_tree(root->left); 
     } 

     if(root->right!= NULL){ 
       cleanup_tree(root->right); 
     } 
     free(root->word); 
     free(root); 
} 
+0

if(左側のノードと右側のノードが両方ともヌル)条件を削除したとき、セグメント化エラーが発生する –

+0

@harvey_slash他にも問題があるはずです。バングラディンは何を言いますか? – dbush

+0

@Paul Ogilvieさんの答えがうまくいきました。 私はNULLを左と右に設定すると、valgrindは満足しています –

関連する問題