了解shared_ptr与

时间:2017-08-26 16:14:43

标签: c++ c++11 c++14

我接受了C&C培训课程"风格C ++和我需要迅速适应现代C ++。我正在用shared_ptr

写一个非常简单的bst
 class bst
 {
 private:
     struct node
     {
         int data;
         shared_ptr<node> l, r;
     };
     shared_ptr<node> head;
     int size;


 public:
     bst() { size = 0; }
     shared_ptr<node> doinsert(shared_ptr<node> curr, int n)
     {
         if (curr.get() == nullptr)
         {
             curr.reset(new node);
             curr->data=n;
             size++;
         }
         else if (curr->data > n)
             curr->l.reset(doinsert(curr->l,n).get());
         else if (curr->data < n)
             curr->r.reset(doinsert(curr->r,n).get());
         return curr;
     }

     void insert(int n)
     {
         shared_ptr<node> temp = doinsert(head,n);
         head.reset(temp.get());
     }

     inline int getsize() { return size; }
 };

我有一个简单的线束:

 int main()
 {
      vector<int> v = {2,1,1,2,3,1};
      bst temp;
      for(auto i : v) temp.insert(i);
 }

看起来第一个元素插入得很好,但之后事情就变得很复杂了。它不会重置指针吗?

1 个答案:

答案 0 :(得分:4)

     shared_ptr<node> temp = doinsert(head,n);
     head.reset(temp.get());

你从一个共享的指针得到一个裸指针并把它放到另一个指针中。当temp被删除时,你的头部有一个悬空指针。而是做

head = doinsert(head,n);

编辑:添加解决方案。