1.6 神器shared_ptr/weak_ptr
shared_ptr 是引用计数型智能指针,在Boost 和std::tr1 里均提供,也被纳入C++(www.cppentry.com)11 标准库,现代主流的C++(www.cppentry.com) 编译器都能很好地支持。shared_ptr<T> 是一个类模板(class template),它只有一个类型参数,使用起来很方便。引用计数是自动化资源管理的常用手法,当引用计数降为0 时,对象(资源)即被销毁。weak_ptr 也是一个引用计数型智能指针,但是它不增加对象的引用次数,即弱(weak)引用。
shared_ptr 的基本用法和语意请参考手册或教程,本书从略。谈几个关键点。
shared_ptr 控制对象的生命期。shared_ptr 是强引用(想象成用铁丝绑住堆上的对象),只要有一个指向x 对象的shared_ptr 存在,该x 对象就不会析构。
当指向对象x 的最后一个shared_ptr 析构或reset() 的时候,x 保证会被销毁。
weak_ptr 不控制对象的生命期,但是它知道对象是否还活着(想象成用棉线轻轻拴住堆上的对象)。如果对象还活着,那么它可以提升(promote)为有效的shared_ptr;如果对象已经死了,提升会失败,返回一个空的shared_ptr。“提升/lock()”行为是线程安全的。
shared_ptr/weak_ptr 的“计数”在主流平台上是原子操作,没有用锁,性能不俗。
shared_ptr/weak_ptr 的线程安全级别与std::string 和STL 容器一样,后面还会讲。
孟岩在《垃圾收集机制批判》8 中一针见血地点出智能指针的优势:“C++(www.cppentry.com) 利用智能指针达成的效果是:一旦某对象不再被引用,系统刻不容缓,立刻回收内存。这通常发生在关键任务完成后的清理(clean up)时期,不会影响关键任务的实时性,同时,内存里所有的对象都是有用的,绝对没有垃圾空占内存。”