我创建了一个二叉树类,它包含: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中运行时,它运行得很好,但在我的终端中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。这可能意味着底部叶子上未初始化的节点left
和right
中有一个随机值。当析构函数运行时,它将尝试释放节点中随机垃圾所指向的内存。
在对节点进行系数运算时,尝试将子节点初始化为NULL
,然后像monoceres建议的那样进行检查。在delete
之后将指针设置为NULL
也会很好,以避免出现错误的双delete
的情况
所以在调试后,我注意到每个正确的子节点都在丢失它的节点,这在进行预购遍历时是可以的,但在删除它时会导致问题,感谢大家的帮助!