shared_ptr在二叉树中的应用

shared_ptr能够不用显式调用delete来释放new出来的空间,尤其是在具有复杂的数据结构时,不用考虑应该如何释放开辟的空间,例如在二叉树中,如果不利用shared_prt,则需要在析构函数中递归调用delete来释放开辟的空间。函数如下所示:

void remove(BinNode<T> *root)
{
	if(root==NULL)
		return ;
	remove(root->lChild);
	remove(root->rChild);
	delete root;
	--size();
}
如果用shared_ptr,就不需要这样来析构了。但是此时一定要注意节点BinNode中的指针必须为shared_ptr<BinNode>类型,因为树结构中的节点都是BinNode的类型,释放的时候都是采用的BinNode的析构函数。

如下所示为完整代码:

#include<iostream>
#include<memory>
using namespace std;

template<typename T>
struct BinNode
{
	T data;
	shared_ptr<BinNode<T> > parent,lChild,rChild;
	BinNode():parent(NULL),lChild(NULL),rChild(NULL){}
	BinNode(T d,shared_ptr<BinNode<T> >p=NULL,shared_ptr<BinNode<T> >l=NULL,shared_ptr<BinNode<T> >r=NULL)
		:data(d),parent(p),lChild(l),rChild(r){}
	~BinNode()
	{
		cout<<"调用BinNode析构函数"<<endl;
	}
};

template<typename T>
class BinTree
{
	int _size;
	shared_ptr<BinNode<T>> root;
public:
	BinTree():_size(0),root(NULL){}
	~BinTree()
	{
		cout<<"调用析构函数"<<endl;
	}
	BinNode<T> *getRoot()
	{	return root.get();	}
	void insertAsLChild(BinNode<T> *parent,T const &e);
	void insertAsRChild(BinNode<T> *parent,T const &e);
};

template<typename T>
void BinTree<T>::insertAsLChild(BinNode<T> *parent,T const &e)
{
	shared_ptr<BinNode<T> > p(new BinNode<T>(e));
	if(parent==NULL)
		root=p;
	else
		parent->lChild=p;
	++_size;
}

template<typename T>
void BinTree<T>::insertAsRChild(BinNode<T> *parent,T const &e)
{
	shared_ptr<BinNode<T> > p(new BinNode<T>(e));
	if(parent==NULL)
		root=p;
	else
		parent->rChild=p;
	++_size;
}

int main()  
{  
	{
		BinTree<int> bt;
		bt.insertAsLChild(0,3);
		bt.insertAsLChild(bt.getRoot(),4);
		bt.insertAsRChild(bt.getRoot(),5);
	}

    system("pause");  
    return 0;  
}
运行结果如下:


可见已经正确的进行了析构。这样就能够避免在创建复杂的数据结构时,过多的考虑析构函数中空间释放的问题。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值