boost中提供了几种智能指针方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而标准库中提供的智能指针为auto_ptr.
这其中,我最喜欢,使用最多的是shared_ptr,也最让人为所欲为.
使用很简单,以下:
头文件 <boost/shared_ptr.hpp>
class A
{
virtual void process();
}
boost::shared_ptr<A> test(new A);
boost::shared_ptr经过重载->(返回传入的指针),test的使用就如同一个指针。其实test是一个对象。
当发生引用时,boost::shared_ptr<A> test1 = test; test1与test共享构造的A指针,引用计算加一。当析够发生时,计算器减一,当计数器为0,删除内嵌指针。
经常使用的boost::shared_ptr函数有:
get() 获取裸指针
reset() 计数器减一
另外,boost::shared_ptr能够方便的和std::vector配合,除了不用担忧节点的野指针等问题,还有一个比较有意思的功能。
class B : public A
{
virtual void process();
void do();
}
std::vector< boost::shared_ptr<A> > vect;
boost::shared_ptr<B> node = boost::shared_ptr<B>(new B);
vect.push_back(node);
vect[0]->do(); //能够很方便的访问B::do(),要知道do()并非A的方法。
boost::shared_ptr有个一个缺点,就是不能从this指针构造。在boost库中,提供了一个解决方案。
#include <boost/enable_shared_from_this.hpp>
class C: public boost::enable_shared_from_this<C> //
{
}
这个状况出如今何时呢,如:
class D
{
public:
void Go(boost::shared_ptr<C> &d);
}
而D的Go方法在C中被使用,这个时候,就须要从this指针构造C的智能指针(boost::shared_from_this()方法提供)。固然,这种方法有一个前提,那就是C在外部的形态也是智能指针。
最后,对全部智能指针作一下简单的介绍吧。
auto_ptr 标准库中的智能指针。可是会转移全部权,如a = b时;内嵌的指针转移到b,智能指针a访问内嵌的指针则为空。
scoped_ptr 与auto_ptr相似,可是不容许复制;
intrusive_ptr是shared_ptr侵入式版本。使用状况,内部以及编写好了本身的内部引用计算器的代码,而又没有时间重写它。intrusive_ptr能够从this构造。
weak_ptr是智能指针shared_ptr的观察者。node