智能指针小结

关于C++库中的智能指针

智能指针的存在是为了巧妙的解决编程过程中资源泄露的问题,利用了栈的特性,出栈之后对象会自动析构的特点来对资源进行有效的释放。
主要存在的有两大类智能指针,带引用计数的智能指针和不带引用技术的智能指针;
不带引用的智能指针:
auto_ptr;
scoped_ptr;
unique_ptr;
以及带引用计数的智能指针:
shared_ptr;
weak_ptr;


auto_ptr

auto_ptr是一种简单的智能指针,采用模板定义,在早期版本中会有一个资源的标志位,标志这个资源的所有权,如果标志位为0那么这个指针其实是不能访问指向的对象的;后来版本中做出了改进,取消了标志位这个机制,它会对拷贝、赋值出来的智能指针采用release方法,对之前的旧指针直接置空,也就是说赋值、拷贝构造等操作完成之后,那么之前的指针也就再不能使用了。

另外它还提供了两个方法:
_Ty *get() const();
get()方法会返回这个智能指针的值。
void reset(_Ty *_Ptr = 0);
reset方法会对之前所指向的对象进行析构,然后会让智能指针再指向现在传入的指针所指向的对象。

scope_ptr

它和auto_ptr很像,对于它来说,它直接私有化了拷贝构造和赋值,也不能用等于和不等运算符,同样也提供了get,reset方法,它还有一个swap方法。
void swap(scoped_ptr & b);
也就是可以对另一个scoped_ptr进行指针的交换。

unique_ptr

unique_ptr创建可以传入两个参数类型,一个当然是指针类型,另外有一个是删除器的类型,也就是对于析构它可以进行“定制化”。它同样也提供了get(),swap(),reset()方法,与上面两个不同的是它还提供了get_deleter()的方法。不过它也没有私有拷贝构造和赋值,它是调用了被赋值的指针的删除器将之前的资源释放。
deleter_reference get_deleter();
可以返回删除器的函数对象。


有了不带引用计数的智能指针,就演化出了智能指针的交叉引用问题,智能指针的交叉引用问题可见百度,为了解决交叉引用问题,这次出现了带引用计数的智能指针,这种指针也因为更好的兼容性而被广泛的采用。

shared_ptr

这是强类型的智能指针,往往和弱类型指针合用。它会有一个引用计数来标记这个资源现在被几个指针引用,只有当引用计数归零时候,资源才会被释放。
同样的,shared_ptr也支持删除器的定制。不过它还提供了中括号重载,可以用[]访问。
它对之前说到的方法都有实现,新增了use_count()方法,owner_before()方法,_internal_equiv()方法。
long use_count() const;
返回当前的引用计数。
template bool owner_before( shared_ptr const & rhs ) const;
template bool owner_before( weak_ptr const & rhs ) const;
返回对于指针owner-based order关系的比较值。这里将指针分为两种情况。一种是owner pointer,代表指针所指向的就是一个内存中的完整的对象,该对象可以被多个智能指针指向其中的某一部分;另外一种就是stored pointer,代表指针所指向的对象类型就是指针的类型,该对象可能是某个完整对象的一部分。对于这些指针,如果存在多个指针指向同一个完整对象的某一部分,则在销毁该对象时,只对完整的对象执行一次析构即可,其余的不需要进行相关析构操作了。当然owner pointer>stored pointer。
bool _internal_equiv( shared_ptr const & r ) const;
返回两个强类型智能指针是否相等。

weak_ptr

这就是弱类型的智能指针,对于指向对象并没有访问权限,如果它要去访问对象那么必须调用lock()方法提升为强类型的智能指针,它所提供的方法和强类型智能指针类似,增加了lock()方法和expired()方法。
shared_ptr lock() const;
提升这个指针,返回一个同类型的强类型指针。
bool expired() const
用来判断智能指针的引用计数是否为0。

explicit——基本上智能指针都加入了explicit关键字,也就是说它的方法不能支持隐式转换。请注意!
对于智能指针来讲,内部实现了原子操作,使用时候无需担心,直接使用就好。

资料参考:
http://blog.csdn.net/a1260912...

你可能感兴趣的:(指针)