首页 > 解决方案 > 出现“SIGSEGV”分段错误并且不确定原因

问题描述

我的程序要求我创建一个二叉搜索树,它也是一个集合。我已经开始将项目插入其中并使其正常工作,但是当我尝试递归获取树的大小时,我的问题就出现了,也就是有多少节点。以下是我认为重要的所有代码。

struct SetNode
{
    T data;
    SetNode<T>* left;
    SetNode<T>* right;

    SetNode(const T& value);
};


//Set based on a BST
template <class T>
class MySet
{
private:
    SetNode<T>* root;

public:

    //constructor, insert function, "contains" function declared here

    //get number of items contained
    int size() const;

    int sizeHelper(SetNode<T>* curNode) const;
}

template<typename T>
int MySet<T>::size() const {
    if (root == nullptr)
        return 0;
    else
        return this->sizeHelper(root);
}

template<typename T>
int MySet<T>::sizeHelper(SetNode<T>* curNode) const {
    return 1 + sizeHelper(curNode->left) + sizeHelper(curNode->right);
}

main我声明Set<string> setA并尝试size使用setA.size(). 从调试器中,我看到这会导致上述 SIGSEGV 错误。sizeHelper如果需要,我可以更改甚至删除它的声明,但除了其中的代码之外,size必须保持原样。应该sizeHelper是非成员函数吗?删除 const 不起作用。

标签: c++setbinary-search-treenodes

解决方案


sizeHelper是一个没有退出条件的递归函数,你只是继续从你给定的节点中读取leftand字段,但你从不检查它们是否是. 如果你通过了,你有 UB 并且可能有段错误。rightnullptrnullptr

为避免它,您需要像这样添加退出条件。

template<typename T>
int MySet<T>::sizeHelper(SetNode<T>* curNode) const {
    if (curNode == nullptr) {
        return 0;
    }
    return 1 + sizeHelper(curNode->left) + sizeHelper(curNode->right);
}

推荐阅读