c++ - 出现“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 不起作用。
解决方案
你sizeHelper
是一个没有退出条件的递归函数,你只是继续从你给定的节点中读取left
and字段,但你从不检查它们是否是. 如果你通过了,你有 UB 并且可能有段错误。right
nullptr
nullptr
为避免它,您需要像这样添加退出条件。
template<typename T>
int MySet<T>::sizeHelper(SetNode<T>* curNode) const {
if (curNode == nullptr) {
return 0;
}
return 1 + sizeHelper(curNode->left) + sizeHelper(curNode->right);
}
推荐阅读
- javascript - jQuery OwlCarousel v1.3.3 - 居中对齐项目
- tensorflow - 在本地使用 Tensorflow 对象检测 API 时出现 Protobuf 错误
- lua - 是否可以 OTA 更新 NodeMCU Lua 文件?
- javascript - 量角器在承诺后找不到相同的元素
- javascript - javascript在生成的表中更改颜色
- javascript - 如何使用 vue-chartjs 隐藏 Polararea 中的区域线
- git - 本地 Git 部署到 Azure 应用服务
- r - 如何在 R 中的多个观察值中一次仅添加一个观察值?
- python-3.x - python3 GPA计算器
- c# - 使用扩展方法检查值是否为 0