【问题标题】:Invalid read even though object exists即使对象存在,读取也无效
【发布时间】: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


【解决方案1】:

检查您是否将leftright 指针初始化为nullptr。可能您不是,它从该内存位置获取随机数据,使指针存在,但它没有指向具有right 属性的对象。此外,如果您在此之前删除任何节点,请向我们展示删除方法和插入方法。其中一个函数可能存在问题。

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

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2022-01-25
    • 2018-11-13
    • 2017-07-31
    • 2023-01-11
    • 1970-01-01
    • 2016-06-29
    • 2020-06-22
    相关资源
    最近更新 更多