美文网首页
C++11智能指针(weak_ptr)

C++11智能指针(weak_ptr)

作者: 宋大壮 | 来源:发表于2019-03-19 19:05 被阅读0次

weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为,没有重载operator*和->,它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count()==0,但更快,表示被观测的资源(也就是shared_ptr的管理的资源)已经不复存在。weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 从而操作资源。但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr。

使用场景

弱引用特性,不拥有对象,只有延迟到尝试调用Lock()时才会有可能临时拥有对象:
只是持有一个没有拥有权的被shared_ptr托管的对象.
只有调用lock()创建shared_ptr指针时才会引用实际对象.
在lock()成功时会延长shared_ptr对象的生命周期,因为它递增了一个引用计数.
在shared_ptr主指针结束后,如果std::weak_ptr的lock()成功的指针还存在,那么这时候还有lock()的代码调用,引用计数仍然递增.
经常用在解除循环引用问题.看以下例子如果Man和Woman各自包含一个std::shared_ptr,那么就会出现内存泄漏,因为Woman,Main的计数实际是2.Woman成员变量是必须是Woman的析构调用后才会调用,而Woman的析构必须是引用计数为0时才会调用,这导致成员变量Man一直没有析构.
例子1:std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
用于在延迟使用主导权的场景, 比如线程A是重要,A完成之后B,C线程可做可不做.这时候B,C就可以使用weak_ptr指针来控制.

相关文章

  • C++11智能指针

    [C++11]智能指针 C++11包括了三种智能指针: shared_ptr weak_ptr unique_pt...

  • C++智能指针作为成员变量

    C++11为我们提供了shared_ptr、unique_ptr和weak_ptr这三种智能指针帮助我们更方便安全...

  • c++智能指针用法

    智能指针是什么 智能指针是c++中有四个智能指针:auto_ptr、shared_ptr、weak_ptr、uni...

  • 再说智能指针

    一 STL的智能指针及使用 STL中智能指针有std::shared_ptr std::weak_ptr std:...

  • C++11智能指针(weak_ptr)

    weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为,没有重载opera...

  • C++11智能指针

    智能指针 unique_ptr shared_ptr weak_ptr 在C98中,智能指针通过一个模...

  • 1 - 智能指针

    https://www.nowcoder.com/discuss/418992 智能指针的实现,weak_ptr为...

  • C++ 智能指针

    C++智能指针[https://zhuanlan.zhihu.com/p/54078587] C++11中智能指针...

  • c++11智能指针(三)weak_ptr

    弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1或减1.它作为一个旁观者来监视sha...

  • 现代 C++:一文读懂智能指针

    智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。...

网友评论

      本文标题:C++11智能指针(weak_ptr)

      本文链接:https://www.haomeiwen.com/subject/ydjnmqtx.html