2016-11-24 25 views
1

intの値、BinaryTree* leftBinaryTree* rightを保持するバイナリツリークラスを作成しました。C++バイナリツリー再帰的デストラクタの問題

class BinaryTree { 
private: 
    int value; 
    BinaryTree* left; 
    BinaryTree* right; 
    bool isVisited; 
public: 
    BinaryTree(); 
    BinaryTree createComplete(int n); 
    ~BinaryTree(); 
} 

私のデストラクタは、次のとおりです。

BinaryTree::~BinaryTree() { 
delete left; 
delete right; 
} 

clionで実行している場合、それは完璧に動作しますが、私の端末で、私は(コアダンプ) セグメンテーション違反を取得します。どこでも私は人々がこれがデストラクタでなければならないと主張しているように見えた。どんな精巧さが助けになるでしょう!

私はまだセグメンテーションフォルトを取得するために私〜BinaryTree機能を更新し、stackoverflowの専門家ではない午前:すべての

BinaryTree::~BinaryTree() { 
if (right != NULL) { 
    delete right; 
} 
if (left != NULL) { 
    delete left; 
} 

}

+1

コンストラクタの定義も表示できますか? –

+0

どのようにBSTを構築していますか?この問題を私たちの目的のために再現できるほどのコードを投稿できますか? – templatetypedef

答えて

2

まず、あなたの現在の実装では、完全な木のものではありません。 それはノードなので、BinaryTreeNodeに名前を変更し、それを使って新しいクラスBinaryTreeを構築することをお勧めします。これはルートを追跡し、ツリーを再帰的に割り当て解除できるようにします。

あなたが盲目的にポインタを削除しようとしているので、あなたのデストラクタが最も重大であると言われています。

まず、nullptrに左と右を初期化してください。 するとif(left != nullptr) { delete left }

+0

'BinaryTree ::〜BinaryTree(){ \t if(right!= NULL){ \t削除権利; \t} \t if(left!= NULL){ \t delete left; \t} } '私のファイルを更新しましたが、まだセグメンテーションを取得しました –

+0

NULLに設定していることを確認しましたか?あなたがゴミの値を含んでいるかもしれないし、あなたのプログラムがメモリを削除しようとしている可能性があります。 – Makaronodentro

+0

まず、私は申し訳ありませんが、それは私の最初または2回目のstackoverflowを使用しています。ここでも、CLionではうまくいきます。 in segfault。 –

0

あなたのコンストラクタを見ることなく、ノードの子をNULLに初期化しないと仮定します。つまり、底辺の葉にある初期化されていないノードleftrightにランダムな値が入っている可能性があります。デストラクタが実行されると、ノード内のランダムなガーベジが指すメモリを解放しようとします。

ノードをctoringするときに子ノードをNULLに初期化してから、monceresのようにチェックしてみてください。またので、デバッグした後、私はすべての右の子は、それが事前に注文トラバーサルに行っている間結構ですノード、だ失うされていることに気づいたerronousダブルdelete

+0

ノードの子をnullに初期化します。 –

0

の事態を避けるためにdeleteNULLへのポインタを設定することが良いだろう、それを削除するときには、問題ごとに助けてくれてありがとう!