微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在二叉搜索树的插入函数中使用 make_shared 时无法编译以下 C++ 代码

如何解决为什么在二叉搜索树的插入函数中使用 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 举报,一经查实,本站将立刻删除。