关于清除二叉搜索树的c++段错误

C++ Segfault on clearing a binary search tree

本文关键字:c++ 错误 搜索树 段错误 于清除 清除      更新时间:2023-10-16

我试图消除我的二进制搜索树中的任何内存泄漏,所以我做了一个简单的递归删除方法。这个方法首先导致

void BST::copy(const BST& other){
    if (other.root != NULL){
        Clear();

哪个Clear();会首先调用recursiveDelete(root);

void BST::recursiveDelete(BSTNode * head){
    if (head == NULL)
        return;
    recursiveDelete(head->left); 
    recursiveDelete(head->right);
    delete head;
}

这段代码会出现Segfault,我不知道为什么。当它调用复制方法时,它只有一个节点,所以它说头部不是NULL,但由于某种原因,当它试图引用head->left时,它会出现分段错误。

任何帮助都将非常感激。:)

EDIT:我不知道这一点,直到其中一个回答的人指出它,但在复制构造函数中,需要在尝试复制之前首先将所有内容初始化为NULL。因此,当我将构造函数更改为以下

时,我的问题解决了(大部分)
BST::BST(const BST & other) : root(NULL), size(0){

第一条注释:如果另一个对象有数据或没有数据,您可能应该清除副本中对象的数据。如果另一个对象为空,那么复制也应该使这个对象为空。

第二条评论:我不能从你的问题中看出,但我希望头->左或头->右在施工期间没有正确设置为NULL。无效但不是NULL值将解释通过if (head == NULL)检查。

在BST::copy中,您的NULL检查不在调用Clear()的同一对象上,这似乎很奇怪。没有足够的代码让我确定,但不应该是:

if (root != NULL) {
    Clear();
}

那么你可能还需要检查其他。= NULL

但是作为一般规则,应该使Clear()无论以哪种方式调用都是安全的。您应该简单地检查Clear()中的NULL

Try after

delete head;
head = NULL;