2016-11-24 137 views
1

我做了一個二叉樹類,它保存: int值,BinaryTree* left,BinaryTree* rightC++二叉樹遞歸析構問題

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

我的析構函數是:

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

在克利翁它完美運行時,但在我的終端,我得到一個 段錯誤(核心轉儲)。我看到的每個地方都聲稱這應該是破壞者。任何闡述都會有所幫助!

我不是一個計算器專家,我更新了我的〜二叉樹功能仍然得到段錯誤:

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 delete right; \t} \t if(left!= NULL){ \t delete left; \t} }'更新了我的文件,仍然收到段錯誤 –

+0

您確定將它們設置爲NULL嗎?如果你沒有,他們可能包含垃圾值,你的程序可能試圖刪除內存不允許觸摸 – Makaronodentro

+0

首先,我很抱歉,這是我第一次或第二次使用stackoverflow,我做了初始化爲NULL。再次,在CLion中它工作正常。在終端段錯誤。 –

0

沒有看到你的構造函數,我假設你不初始化你的節點的孩子爲NULL。這可能意味着底部葉子處的未初始化節點leftright在它們中具有隨機值。當析構函數運行時,它將嘗試釋放節點中隨機垃圾指向的內存。

嘗試初始化您的子節點爲NULL,當ctoring節點,然後檢查它像monoceres建議。這也將是不錯的設定指針NULLdelete後避免調試完畢,我注意到,每一個正確的孩子失去它的節點,而前序遍歷會是罰款後erronous雙delete

+0

我將節點的子節點初始化爲null。 –

0

的情況下,但是當刪除它時,問題的答案,感謝每一個幫助!