我接受了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);
}
看起来第一个元素插入得很好,但之后事情就变得很复杂了。它不会重置指针吗?
答案 0 :(得分:4)
shared_ptr<node> temp = doinsert(head,n);
head.reset(temp.get());
你从一个共享的指针得到一个裸指针并把它放到另一个指针中。当temp被删除时,你的头部有一个悬空指针。而是做
head = doinsert(head,n);
编辑:添加解决方案。