1、shared_ptr
shared_ptr是一个引用计数智能指针,用于共享对象的所有权。
可以从一个裸指针、另一个shared_ptr、一个unique_ptr、或者一个weak_ptr构造。
析构函数被调用时引用计数减1;当引用计数减为0时,调用删除器删除对象;默认operator delete。
构造函数的第二个参数接受一个删除器,这样就可以定制自己的资源分配回收器了。
不要为了防止资源泄漏而使用shared_ptr,应该使用unique_ptr,因为前者耗资源。
多线程中使用时,对引用计数的操作是不带锁的,所以应该转换成weak_ptr。
注意:
1、不要多次引用同一个数据,这会造成多次删除而出错;
2、包装this指针的问题;
3、循环引用导致内存泄露;
4、多线程使用。
2、weak_ptr
week_ptr是对对象的一种弱引用,不会增加对象的引用计数。
week_ptr和shared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptr,week_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr)。
强引用:被引用的对象还活着时,这个引用必然存在,例如shared_ptr;弱引用:被引用的对象还活着时,这个引用不一定存在,例如week_ptr。弱引用并不修改该对象的引用计数,这意味这弱引用并不对对象的内存进行管理,在功能上类似于普通指针,但一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存。
可以用来打破循环引用。
依附于shared_ptr而存在,单独存在无意义。
在多线程时,应当将shared_ptr转成weak_ptr。
3、unique_ptr
unique_ptr是一个独享所有权的智能指针。
1、保存指向某个对象的指针,当它本身被删除释放的时候,会使用给定的删除器释放它指向的对象。
2、无法进行复制构造,也无法进行复制赋值操作,但可以进行移动构造和移动赋值操作;
简单来说, unique_ptr就是一个封装了对象指针和其删除器的对象,当自身析构时,调用被封装对象的删除器。