即使对象存在也无效读取

时间:2018-11-21 06:24:52

标签: c++ c++11 binary-search-tree avl-tree

我正在尝试实现自平衡二进制搜索树。当我尝试获得正确分支的高度时,它会一直起作用,直到达到这一点为止。然后,我得到一个分段错误错误,并且valgrind说有一个无效的大小为8的读取。奇怪的是,当我看着树出现此错误时,右分支不为null。是否有一些我遗忘的检查会导致此错误?

引发错误的行:

int rightChildHeight = 0;
if (n->right != NULL)
    rightChildHeight = n->right->getHeight();

getHeight():

int Node::getHeight()
{
// No kids => 2
if (!left && !right)
    return 1;
// 1 kid => height of kid +1
else if (!left && right)
    return right->getHeight() + 1;
else if (left && !right)
    return left->getHeight() + 1;
// 2 kids => height of taller kid +1
else
    return max(left->getHeight(), right->getHeight()) + 1;
}

发生错误时的树:

Tree when the error occurs.

1 个答案:

答案 0 :(得分:0)

检查是否将leftright指针初始化为nullptr。可能不是,并且它正在从该内存位置获取随机数据,使指针存在,但它并不指向具有right属性的对象。另外,如果您在此之前删除任何节点,请向我们显示delete方法和insert方法。这些功能之一可能有问题。

此外,您还应尝试与代码保持一致,首先要检查像if (n->right != NULL)这样的可为空性,然后要像这样if (!left && !right)那样,老实说,我更喜欢第二种方式,它更干净。