【C++】弱智能指针weak_ptr详解

在最早有介绍关于智能指针的博文,但并未深入探讨弱智能指针的存在,这是简单提到它是来配合强智能指针一起使用,且不可以单独使用,所以对于弱智能指针它的作用就是解决强智能指针之间的相互引用而存在的。https://blog.csdn.net/IT_Mitchell/article/details/86615669

那,本文主要介绍关于弱智能指针weak_ptr的一些东西;

关于weak_ptrweak_ptr是伴随shared_ptr而被引入的。

weak_ptr本身也是一个模板类,但是不能直接用它来定义一个智能指针的对象,只能配合shared_ptr来使用,可以将shared——ptr的对象赋值给weak_ptr,并且这样并不会改变引用技数的值。他内部没有重载operator*和->,它的最大作用就是协助shared_ptr,像旁观者那样观测资源的使用情况:

具体用法:

  • 第一:Weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造(也只能由此构造),获得资源的观测权。但是weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加;
  • 第二:使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count() == 0,但更快,表示被观测的资源(也就是shared_ptr管理的资源)已经不复存在了。
  • 第三:进行所构造的对象的内存管理、生存期管理的是那个强引用的boost::shared_ptr,而weak_ptr知识提供了对管理对象的一个访问手段;
  • 第四:weak_ptr支持拷贝和赋值,但不会影响对应的shared_ptr内部对象的计数;
  • 第三:Weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象,操作资源。但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr。

注意:weak_ptr虽然是一个模板类,但不能直接定义指向原始指针的对象;weak_ptr接受shared_ptr类型的变量赋值,但是反过来是不可以的,需要使用lock函数;weak_ptr它本身是存在引用计数的 ,因为它本身不会增加引用计数,所以它指向的对象可能在它用的时候已经被释放了,所以在用之前需要使用expired函数来检测是否过期,然后使用lock函数来获取其对应的shared_ptr对象;weak_ptr中只有函数lock和expired两个函数比较重要

关于weak_ptr内部的几个成员函数介绍:

  • expired()函数:用于检测所管理的对象是否已经释放,如果已经释放,返回true,否则返回false;
  • lock()函数:用来获取其对应的shared_ptr对象;用于获取所管理的对象的强引用(shared_ptr)。如果expired为true,返回一个空的shared_ptr,否则返回一个有效的shared_ptr,其内部对象指向与weak_ptr相同;
  • use_count()函数:返回与shared_ptr共享的对象的引用计数;
  • reset将weak_ptr置空;

了解这些之后,对于weak_ptr如何访问对象:它会通过lock函数去获取强智能指针的对象,在此之前会调用expired函数去检测强智能指针对象是否存在;

在这里提一个点:关于c++的循环引用,主要体现在强智能指针这一块,处理办法就是我们的弱智能指针了。

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