C++二进制树递归析构函数问题

C++ Binary Tree recursive destructor issue

本文关键字:析构函数 问题 递归 二进制 C++      更新时间:2023-10-16

我创建了一个二叉树类,它包含:int值,BinaryTree* leftBinaryTree* 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中运行时,它运行得很好,但在我的终端中segfault(堆芯转储)。我所到之处,人们都声称这应该是销毁器。任何详细说明都会有所帮助!

我不是stackoverflow专家,我更新了~BinaryTree函数,仍然得到一个segfault:

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

}

首先,您当前的实现不是一个完整的树。它是一个节点,因此我建议将其重命名为BinaryTreeNode,并用它来构造一个新的类BinaryTree,它可以跟踪根,并允许您递归地取消分配树。

话虽如此,你的析构函数很可能会出错,因为你盲目地试图删除指针。

首先确保将left和right初始化为nullptr。然后你做if(left != nullptr) { delete left }

在没有看到构造函数的情况下,我假设您不会将节点的子级初始化为NULL。这可能意味着底部叶子上未初始化的节点leftright中有一个随机值。当析构函数运行时,它将尝试释放节点中随机垃圾所指向的内存。

在对节点进行系数运算时,尝试将子节点初始化为NULL,然后像monoceres建议的那样进行检查。在delete之后将指针设置为NULL也会很好,以避免出现错误的双delete的情况

所以在调试后,我注意到每个正确的子节点都在丢失它的节点,这在进行预购遍历时是可以的,但在删除它时会导致问题,感谢大家的帮助!