如何解决为什么在二叉搜索树的插入函数中使用 make_shared 时无法编译以下 C++ 代码
下面的代码没有编译,错误不是很清楚。如果我进行更改以删除编译错误,那么它会在插入函数中崩溃。请你让我知道这里出了什么问题。在制作自己的容器时使用 shared_pointers 也不是一个好主意/好的做法。
'''
// generic binary search tree
#include <queue>
#include <stack>
#include <iostream>
#include <memory>
#include <stack>
#include <queue>
using namespace std;
template<typename T>
class BSTNode {
public:
BSTNode() {
left = right = nullptr;
}
BSTNode(const T& e,shared_ptr<BSTNode <T> > l = nullptr,shared_ptr<BSTNode <T> > r = nullptr) {
el = e; left = l; right = r;
}
T el;
shared_ptr<BSTNode <T> > left = make_shared<BSTNode <T> >();
shared_ptr<BSTNode <T> > right = make_shared<BSTNode <T> >();
~BSTNode()
{
cout<<"~BSTNode"<<endl;
}
};
template<class T>
class BST {
public:
BST() {
root = nullptr;
}
~BST() {
cout<<"~BST"<<endl;
}
void insert(const T);
protected:
shared_ptr<BSTNode<T> > root;
};
template<class T>
void BST<T>::insert(const T el) {
shared_ptr<BSTNode<T>> p = root,prev = nullptr;
while (p != nullptr) { // find a place for inserting new node;
prev = p;
if (el < p->el)
p = p->left;
else p = p->right;
}
if (root == nullptr) // tree is empty;
{
//It is crashing here.
root = make_shared<BSTNode<T> >(new BSTNode<T>(el));
}
else if (el < prev->el)
prev->left = make_shared<BSTNode<T> >(el);
else prev->right = make_shared<BSTNode<T> >(el);
}
//In main function:
BST<int> obj1;
obj1.insert(12);
'''
解决方法
我相信这些台词
shared_ptr<BSTNode <T> > left = make_shared<BSTNode <T> >();
shared_ptr<BSTNode <T> > right = make_shared<BSTNode <T> >();
正在递归调用构造函数,并且递归是无界的。所以我认为 seg 错误是因为调用堆栈正在爆炸。也许尝试将这些行更改为此或类似的内容。
shared_ptr<BSTNode <T> > left = nullptr;
shared_ptr<BSTNode <T> > right = nullptr;
然后,在分配它们时,调用 make_shared() 为它们分配内存。
,root = make_shared<BSTNode<T> >(new BSTNode<T>(el));
尝试从 BSTNode<T>
构造 BSTNode<T>*
,但是您有一个 BSTNode<T>
构造函数,它采用 const T&
,因此您可能想要编写root = make_shared<BSTNode<T> >(el);
。 make_shared
将创建 BSTNode<T>
,因此您无需使用 new
创建它。您只需将构造函数的参数传递给 make_shared
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。