关于清除二叉搜索树的C ++ Segfault

时间:2011-10-06 01:27:03

标签: c++ segmentation-fault

我正在尝试消除我正在制作的二进制搜索树中的任何内存泄漏,因此我制作了一个简单的递归删除方法。这是首先导致

的方法
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,我不知道为什么。当它调用复制方法时,它只有一个节点,因此它表示head不是按预期的那样是NULL,但是由于某些原因它尝试引用head->left时会出现段错误。

非常感谢任何帮助。 :)

编辑:我不知道这一点,直到有人回答说出来,但在复制构造函数中,需要先将所有内容初始化为NULL,然后再尝试复制。因此,当我将构造函数更改为以下

时,我的问题已解决(大多数情况下)
BST::BST(const BST & other) : root(NULL), size(0){

3 个答案:

答案 0 :(得分:2)

第一条评论:如果其他对象有数据,您应该清除副本中的对象数据。如果另一个对象为空,则副本也应该使该对象为空。

第二条评论:我无法从你的问题中得知,但我希望head-> left或head-> right在构造过程中没有正确设置为NULL。无效但不是NULL值将说明超过if (head == NULL)检查。

答案 1 :(得分:1)

在BST :: copy中,对NULL的检查与调用Clear()时不在同一对象上似乎很奇怪。我没有足够的代码可以肯定地说,但不应该是:

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

然后,您可能还需要检查other.root!= NULL以查找尚未发布的后续代码。

但作为一般规则,Clear()应该可以安全地调用。您只需在Clear()中检查NULL。

答案 2 :(得分:0)

尝试

delete head;

head = NULL;

并确保在构造函数中将left和right设置为NULL。