小编day*_*man的帖子

使用智能指针进行C++二叉搜索树

我用c ++实现了二叉搜索树.而不是使用裸指针指向我使用的节点的孩子std::shared_ptr.树的节点如下实现

struct treeNode;
typedef std::shared_ptr<treeNode> pTreeNode;

struct treeNode {
    T key;
    pTreeNode left;
    pTreeNode right;
    treeNode(T key) : key(key), left(nullptr), right(nullptr) {}
};
Run Code Online (Sandbox Code Playgroud)

从BST中删除节点时,其中一种情况是节点只有一个子节点.该子节点简单地替换该节点,如下所示:

             |        remove node                  
            node      --------->     |
               \                    right 
              right                
Run Code Online (Sandbox Code Playgroud)

在类似的Java实现中,这可以编码为:

node = node.getRight();
Run Code Online (Sandbox Code Playgroud)

在我的C++实现中,它是:

node = node->right;
Run Code Online (Sandbox Code Playgroud)

其中node是type pTreeNode.

pTreeNode(std::shared_ptr<TreeNode>)上调用=运算符时,node将调用析构函数.指向底层的共享指针的数量TreeNode是1,因此TreeNode被破坏释放其内存.当TreeNode(默认)调用析构函数,每个成员都毁灭了.这肯定会导致pTreeNode right成员被摧毁.问题node->right在于分配给的是什么node.在测试我的BST时,它似乎工作正常,没有错误/内存泄漏.

  • 我在做什么不安全?
  • 如果它不安全,我该怎么做才能解决这个问题?

我认为可能有用的"黑客"是制作另一个指针以增加其引用计数.这是一个适当的解决方案吗?

//increase reference to node->right by 1 so it doesn't get …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers shared-ptr binary-search-tree c++11

11
推荐指数
1
解决办法
1673
查看次数