首页 > 解决方案 > 在 C++ 中构建二叉树后的分段错误

问题描述

我已经用 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-faultbinary-tree

解决方案


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

那么,引擎盖下发生了什么?当你调用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 中引入的NULLuse 。nullptr


推荐阅读