【发布时间】:2018-11-21 06:24:51
【问题描述】:
我正在尝试实现一个自平衡二叉搜索树。当我尝试获得正确分支的高度时,它一直有效,直到我达到这一点。然后我得到一个分段错误错误,valgrind 说有一个大小为 8 的无效读取。奇怪的是,当我在发生此错误时查看树时,右分支不为空。是否有一些我忘记做的检查导致了这个错误?
抛出错误的行:
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;
}
发生错误时的树:
【问题讨论】:
-
“右分支不为空” - 也不意味着它拥有一个有效的地址。您在树的初始化/旋转/插入/删除中的某处有错误。我们无法在精神上为您找到它。
-
很可能,
right是一个“悬空指针”(即它是非空的,但它没有指向一个有效的对象——这通常发生在它指向的对象被删除时,但指针没有被修改,所以它仍然指向对象先前存在的内存位置。取消引用悬空指针是一个错误并调用未定义的行为) -
指针 n 未指向有效地址。
-
@TungLeThanh 但是如果我指向 n->left 我不会出错。这是否意味着 n->right 没有指向有效地址?
-
@BlakeMorgan:如果您的程序工作内存空间真正位于 0x5555555xxxxx,n 是有效的,抱歉。我看到 Valgrin ou 调试程序有时会用 0x55 填充未使用/未初始化的内存。
标签: c++ c++11 binary-search-tree avl-tree