具体的には、この質問が以前にここで尋ねられたのを見たことがあります
一般的な二分木ノード デストラクタの問題 と 二分探索ツリー デストラクタ など
しかし、これまでのところ、コンストラクターで Node ポインターを NULL に設定するという答えが得られました。Node と Tree のコンストラクタとデストラクタのコードは次のとおりです。
template <class Type>
class Node {
protected:
Type data;
public:
Node<Type>(Type data) { this->data = data; }
};
バイナリ ツリー ノードは、上記のノードから継承します (継承を使用せず、単純に BinaryTreeNode をデータと共に使用する方が簡単であることはわかっていますが、練習しているので、この方法を選択しました)
BinaryTreeNode クラス:
template <class Type>
class BinaryTreeNode: public Node<Type> {
protected:
BinaryTreeNode<Type> *left;
BinaryTreeNode<Type> *right;
BinaryTreeNode<Type> *parent;
public:
BinaryTreeNode<Type>(Type data) : Node<Type>(data) {
this->left = NULL;
this->right = NULL;
this->parent = NULL;
}
~BinaryTreeNode<Type>() {
delete left;
delete right;
delete parent;
}
};
ツリーの場合:
template <class Type, template <class> class NodeType = BinaryTreeNode>
class BinaryTree {
protected:
int size;
NodeType<Type> *root;
public:
~BinaryTree<Type, NodeType>() {
delete root;
}
BinaryTree<Type, NodeType>() {
this->size = 0;
this->root = NULL;
}
};
主に、次のことを行います。
BinaryTree<int> *bt = new BinaryTree<int>();
bt->insert(100);
bt->insert(50);
bt->insert(101);
上記はうまくいきます、これまでのところとても良いです。
挿入メソッド/関数は、新しいノードの作成が行われる場所です。次に、次のそれぞれを (1 つずつ) 使用してみましたが、すべて segfault (コア ダンプ) が発生します。
delete bt->getRoot();
これにより、セグメンテーション違反が発生しました。私はそれから試しました
delete bt->getRoot()->getRight();
再びセグメンテーション。だから最後に試した
delete bt;
まだセグメンテーション違反
他のノードに到達できないためにメモリリークが発生するだけだと思っていましたが(valgrindで実行しています)、驚いたことに、valgrindがクラッシュし、gccとclangは-Wallを使用しても警告を出力しませんでした。これを正しく行う方法についてアドバイスが必要です。前もって感謝します。