1. 智能指针
scoped_ptr
只在作用域内生效,离开作用域既释放资源,不能复制和赋值。类似于标准库的auto_ptr,但它相对于auto_ptr的优势在于,他的要求更严格,使用起来更安全。auto_ptr拥有转移语义,当使用了赋值和复制操作时可能操作未定义行为。
scoped_array
scoped_array的数组形式,区别在于他管理的对象是用new []分配,同时释放时用delete[],能正确的释放数组对象。不能用*和->操作符,支持[]操作符方式解引用。scoped_array不推荐使用,因为使用麻烦,可以用vector代替。
shared_ptr
shared_ptr是一个引用计数型智能指针,当计数为0时自动释放管理的资源。支持*和->指针操作行为,提供隐式bool类型转换用于指针有效性判断。通过get()方法可以获取原始指针。
shared_ptr有两个专门的函数来检查引用计数。unique()指示该指针是否是对象的唯一管理者。use_count()指示对象正在由多少智能
指针引用。
shared_ptr支持比较运算,基于内部保持的指针实现。
通过make_shared<T>()函数可以使用工厂创建share_ptr对象,而省去显示的new调用。
shared_ptr支持定制删除器,可以指定share_ptr管理的对象在析构时自动调用删除器,这样可以使用share_ptr管理socket、file等任何资源对象。
shared_array
shared_array和shared_ptr的管理类似于scope_array和scope_ptr的关系,同样是用于管理数组对象。同样不推荐使用,使用shared_ptr的容器vector<share_ptr<T>>更灵活。
weak_ptr
weak_ptr一般和shared_ptr配合使用,它相当于shared_ptr的一个辅助对象。shared_ptr和所引用的对象是一种强引用的关系,而weak_ptr和所引用的对象是一种弱引用关系,它并不增加对象的引用计数。
weak_ptr的lock()函数会去询问对象是否已经释放,如果释放则返回一个空指针的shared_ptr,如果对象存在,则返回一个管理该对象的share_ptr。
weak_ptr的expired()函数用于判断对象是否已经被析构,如果对象被析构则返回true.
weak的expired和lock函数配合使用可以用于一些特殊情景,首先判断对象是否存在,如果存在则获取管理的对象的share_ptr指针并调用对象相关的方法。