2011-09-12 12 views
0

コードは次のとおりです。 root->pointers[0]のポインタを譲渡した後にbtreeRightを解放しています。解放すると、プログラムが不安定になり、バランスのとれたbtreeが取得されません。私はメモリを正しく解放しているかどうか教えてください。もし私がそれを解放する方法を提案しないでください?次のコードがメモリをリークします

  int order =5; 

     typedef struct BTREE_HELP { 
     // 
     }*BTREE,BTREE_NODE; 

     BTREE btree_Start(void){ 
     BTREE TempBtreeNode; 
     TempBtreeNode = malloc(sizeof(BTREE_NODE)); 
     TempBtreeNode->keys=malloc((order-1) * sizeof(int)); 
     TempBtreeNode->pointers=malloc((order) * sizeof(void *)); 

     TempBtreeNode->isLeaf = FALSE; 
     TempBtreeNode->numKeys = 0; 
     TempBtreeNode->parent = NULL; 
     TempBtreeNode->next = NULL; 
     return TempBtreeNode; 
     } 


     BTREE btree_NewRoot(int key,BTREE btreeRight) { 
     BTREE root; 
     root = btree_start(); 
     root->keys[0] = key; 
     root->pointers[0] = btreeRight; 
     root->numKeys++; 
     root->parent = NULL; 
     btreeRight->parent = root; 
     free(btreeRight->keys); 
     free(btreeRight->pointers); 
     free(btreeRight); 
     return root; 
     } 
+1

[valgrind](http://valgrind.org/)などを見て、メモリリークの特定に問題がある場合はここに戻ってください! –

+3

'btreeRight'を何かに割り当てた後に解放することは、かなり保証されたクラッシュです。私は 'btree_NewRoot'が何をしようとしているのか分からないので、これを修正する方法はわかりません。 –

+0

** btree_NewRoot **は、ルートがいっぱいになったときに新しいルートを生成します。削除プロセスでは、btreeの要素が削除され、新しいルートを生成する必要があります。私はメモリを解放する適切な方法に従っているのかどうか疑問に思っています。 valgrindはこのモジュール** bplus_NewRoot **でメモリリークを表示しませんが、このメモリを解放した後にツリーが不均衡になります。 – thetna

答えて

4

メモリリークはありません。しかし、なぜあなたは記憶を解放していますか?あなたはbtreeRightrootに格納しています。

おそらく、より良い押し込みはうまくいかないでしょう。

関連する問題