我创建了一个二叉树类,其中包含:
int
值,BinaryTree* left
,BinaryTree* right
。
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中运行时效果很好,但在我的终端中我得到了 段错(核心转储)。我看到的每个地方都声称这应该是析构函数。任何细化都会有所帮助!
我不是stackoverflow专家,我更新了我的~binaryTree函数仍然得到一个段错误:
BinaryTree::~BinaryTree() {
if (right != NULL) {
delete right;
}
if (left != NULL) {
delete left;
}
}
答案 0 :(得分:2)
首先,您当前的实现不是完整树的实现。 它是一个节点,因此我建议将其重命名为BinaryTreeNode并使用它来构造一个新的BinaryTree类,它跟踪根并允许您递归地解除分配树。
说过你的析构函数很可能是段错误,因为你是盲目地试图删除一个指针。
首先确保左右初始化为nullptr。
然后你做if(left != nullptr) { delete left }
答案 1 :(得分:0)
在没有看到构造函数的情况下,我假设您没有将节点的子节点初始化为NULL。这可能意味着底部的未初始化节点left
和right
在其中具有随机值。当析构函数运行时,它将尝试释放节点中随机垃圾指向的内存。
尝试在节点关联时将子节点初始化为NULL
,然后像建议的monoceres一样检查它。在NULL
之后将指针设置为delete
以避免错误的双重delete
答案 2 :(得分:0)
所以在调试之后,我注意到每个孩子都失去了它的节点,这些节点在进行预订时进行遍历是正常的,但是在删除它时会产生问题,感谢每个人的帮助!