boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr
,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位,
但实际上,这个库也有问题,连城写过一片文章,详细介绍了boost::shared_ptr库的四宗罪,不过我觉得有的问题,实际上不能怪shared_ptr,甚至boost
也给出了响应的解决方案,虽然不是完美,但也甚觉不错。 boost库中除了 shared_ptr ,还提供了 scoped_ptr, weak_ptr
两种智能指针,下面详细介绍这三种智能指针的用法以及弊端
scoped_ptr 是一个
有严格所有权的智能指针,其所有权不能转让,一旦申明一个scoped_ptr ,他就会一直拥有该对象,直到该对象失去作用自动释放。scoped_ptr
的几个重要函数原型是:template<class T>class scoped_ptr {private:
T *px; scoped_ptr (scoped_ptr const & copy);
scoped_ptr & operator =
(scoped_ptr const & copy);public: explict
scoped_ptr (T *p = 0); ~scoped_ptr();
void reset(T *p = 0); T & operator *
() const; T * operator -> () const; T *
get () const; operator unspecified_bool_type() const;
void swap(scoped_ptr &
b); }
通过上述几个函数,我们就能一窥 scoped_ptr 所有权不能变更的原因了。第一:将scoped_ptr
的拷贝构造函数申明为私有的,这样外部如要调用,在编译时就已经产生违规现象了。第二:将scoped_ptr 的 赋值操作符 =
申明为私有的,也就使得像 scoped_ptr< > ptr1 = scoped_ptr
<> ptr2
这种用法失去了效果,在编译时就会产生违规现象了。从而使得其所有权永远牢固的掌握在scoped_ptr
最初的那个对象手中,防止了无故的滥用
从以上说明,我们可以看出,scoped_ptr
对象不能用于函数调用中,不能存放在容器中。其存放的对象,除非其主动放弃所有权(swap函数调用),不然始终是由其保管的。
从以上信息可以看出,scoped_ptr
主要用于所有权清晰,从始至终都是由一个对象保管,不会用于参数传递的对象上,一旦所有权转让了,也就失去了作为scoped_ptr
的作用了。
weak_ptr 一般来说,他是为配合shared_ptr
而引入的一种智能指针,它更像是一个助手而不是一个指针。因为其没有重载 * 和 -> 这两个最重要的 操作符,使得其有点“不像”
指针。所以,他是一个“弱”指针,他不能共享指针,不能操作资源。 但这个weak_ptr
却有另外一个用处,首先看一下他的定义template<class T>class weak_ptr{private:
public: weak_ptr(); template
<class Y> weak_ptr(share_ptr <Y> const &r);
weak_ptr (weak_ptr const &);
~weak_ptr();
weak_ptr & operator
=(weak_ptr const &r);
long use_count()
const;
bool expired() const;
shared_ptr<T> lock()
const;
void reset(); void
swap(weak_ptr <T> &b);};
从上面的几个接口可以看出,weak_ptr
却是是很弱的。很多东西都不提供,功能非常有限.但实际上,weak_ptr 还是有很多用处的。1、他可以使用一个非常重要的成员函数lock
从被探测的sheard_ptr 获取一个可用的shared_ptr 对象,从而操作资源(注意,如果expired() == true
则会返回一存储空指针的shared_ptr );2、他可以用来返回 this 指针:一个指向 shared_ptr
的含有自身对象的指针。如果这时候直接使用shared_ptr 容易导致很严重的循环引用,用weak_ptr 就能较好的实现避免循环引用。
但注意,如果一个非new
的对象,却是不能这么用的,不然在释放的时候会导致很严重的错误:释放一个栈上的对象,从而发生未定义的错误。
http://hi.baidu.com/anexx/item/3e7d7ad5d402e81620e250cb
关于boost 的smart_ptr 的使用问题,布布扣,bubuko.com