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;
}
运行结果如下:
可见已经正确的进行了析构。这样就能够避免在创建复杂的数据结构时,过多的考虑析构函数中空间释放的问题。