【问题标题】:Segmentation Fault after building Binary Tree in C++在 C++ 中构建二叉树后的分段错误
【发布时间】:2020-08-01 23:20:29
【问题描述】:

我已经用 C++ 构建了一个二叉树。构建树后,出现分段错误。不知道为什么。

void buildTree(binTreeNode * r, int i){
    if(i > 0)
    {
        if(r != NULL)
        {
        if(r->left == NULL)
        {
            r->left = new struct binTreeNode;
            r->left->item = r->item + 1;
        }
        if(r->right == NULL)
        {
            r->right = new struct binTreeNode;
            r->right->item = r ->item + 1;

        }
        }
        i--;
        buildTree(r->left, i);
        buildTree(r->right, i);
    }
    return;
}

我在main中将初始id设置为1

【问题讨论】:

标签: c++ segmentation-fault binary-tree


【解决方案1】:

问题很可能是由于您初始化了struct binTreeNode 实例。与 Java 或 Python 等语言不同,C++并不总是将所有属性/成员初始化为零,而是取决于on semantics 何时执行此操作。

那么,幕后发生了什么? 当您调用new your_type; 时,操作系统会为您提供一块内存。您得到的唯一保证是分配的内存至少your_type 的大小。如果你(非常¹⁰)幸运的话,那块内存会被设置为零。然而,更有可能的是,这块内存之前被另一个进程使用(并释放)了,该进程写入了它。因此它包含随机数据。

实际上,这意味着binTreeNode->left可能NULL,但这不能保证binTreeNode->right 也是如此。

如何解决:

定义一个构造函数,显式设置实例的初始值。对于您的情况,这样的事情就足够了:

struct binTreeNode {
    int id;
    binTreeNode* left;
    binTreeNode* right;

    binTreeNode()
    : id{0}
    , left{NULL}
    , right{NULL}
    {}
};

如果您从未听说过构造函数(以防万一): 构造函数是特殊方法,在创建类型的新实例时调用。

作为附加说明,请使用 C++11 中引入的 nullptr 代替 NULL

【讨论】:

  • 我建议向构造函数声明一个默认参数:binTreeNode(int _id=0) : id{0} , left{NULL} , right{NULL} {},以便可以在构造调用中定义对象的值:new binTreeNode(r->id+1);
  • 哎呀,我的意思当然是binTreeNode(int _id=0) : id{_id} , left{NULL} , right{NULL} {}
  • 我想你的意思是说binTreeNode(int id=0) : id{id}, ...。这里不需要下划线。 :-)
【解决方案2】:

您遇到分段错误的原因可能是当您创建一个新节点时,您只初始化了它的数据成员id,而没有初始化它的其他两个数据成员leftright。因此,当您在这个新节点上调用buildTree 时,这两个指针将是wild pointers。任何取消引用野指针的尝试都可能导致分段错误。

这个答案假设binTreeNode 是一个简单的C 风格struct。如果它是一个具有初始化其所有数据成员的构造函数的类,那么这个答案是不正确的。由于你没有发布binTreeNode的定义,我不可能知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多