智能指针:weak_ptr

weak_ptr(弱引用智能指针)

弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手,它不管理shared_ptr 内部的指针。std::weak_prt没有重载操作符 * 和 ->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。

初始化:

智能指针:weak_ptr_第1张图片
智能指针:weak_ptr_第2张图片

use_count()

通过调用std::weak_ptr类提供的 use_count()方法可以获得当前所观测资源的引用计数

智能指针:weak_ptr_第3张图片
智能指针:weak_ptr_第4张图片

通过打印的结果可以知道,虽然弱引用智能指针wp3,wp4,wp5,监测的资源是同一个,但是它的引用计数并没有发生任何变化,也进一步证明了weak_ptr只是监测资源,并不是管理资源。

expired()

通过调用std::weak_ptr类提供的expired()方法来判断观测的资源是否已经被释放

智能指针:weak_ptr_第5张图片

weak_ptr监测的就是 shared_ptr管理的资源,当共享智能指针调用 shared.reset();之后管理的资源被释放,因此 weak.expired()函数的结果返回true,表示监测的资源已经不在

lock()

通过调用std::weak_ptr 类提供的lock()方法来获取管理所监测资源的shared_ptr对象

智能指针:weak_ptr_第6张图片

sp2 = wp.lock();通过调用lock()方法得到一个用于管理 weak_ptr 对象所监测的资源的共享智能指针对象,使用这个对象初始化sp2,此时所监测资源的引用计数为2,sp1.reset();共享智能指针sp1被重置,weak_ptr对象所监测的资源的引用计数减1,sp1=wp.lock(); sp1重新被初始化,并且管理的还是weak_ptr对象所监测的资源,因此引用计数加1,共享智能指针对象sp1和sp2管理的是同一块内存,因此最终打印的内存中的结果是相同的,都是520.

返回管理this的share_ptr

智能指针:weak_ptr_第7张图片
智能指针:weak_ptr_第8张图片

通过输出的结果可以看到一个对象被析构了两次,其原因是这样的:再这个李子中使用同一个指针this构造了两个智能指针对象sp1和sp2,这二者之间是没有任何关系的,因为sp2并不是通过sp1初始化得到实例对象。在离开作用域之后this 将被构造的两个智能指针所各自析构,导致重复析构的错误。

智能指针:weak_ptr_第9张图片
智能指针:weak_ptr_第10张图片

循环引用问题

智能指针:weak_ptr_第11张图片
智能指针:weak_ptr_第12张图片

共享智能指针ap,bp对A,B实例对象的引用计数变为2,在共享智能指针离开作用域之后引用计数只能减为1,这种情况下不会去删除智能指针管理内存,导致类A,B的实例对象不能被析构,最终造成内存泄漏。通过使用weak_ptr可以解决这个问题,只需要将类A或者类B的任意一个成员改为weak_ptr.

智能指针:weak_ptr_第13张图片
智能指针:weak_ptr_第14张图片

你可能感兴趣的:(c++11,c++)