• C++11 智能指针之weak_ptr


    0.Overview

    shared_ptr、unique_ptr 类型指针一样,weak_ptr 智能指针也是以模板类的方式实现的。weak_ptr( T 为指针所指数据的类型)定义在头文件,并位于 std 命名空间中。因此,要想使用 weak_ptr 类型指针,程序中应首先包含如下 2 条语句:

    1. #include
    2. using namespace std;

    需要注意的是,C++11标准虽然将 weak_ptr 定位为智能指针的一种,但该类型指针通常不单独使用(没有实际用处),只能和 shared_ptr 类型指针搭配使用。甚至于,我们可以将 weak_ptr 类型指针视为 shared_ptr 指针的一种辅助工具,借助 weak_ptr 类型指针, 我们可以获取 shared_ptr 指针的一些状态信息,比如有多少指向相同的 shared_ptr 指针、shared_ptr 指针指向的堆内存是否已经被释放等等。

    需要注意的是,当 weak_ptr 类型指针的指向和某一 shared_ptr 指针相同时,weak_ptr 指针并不会使所指堆内存的引用计数加 1;同样,当 weak_ptr 指针被释放时,之前所指堆内存的引用计数也不会因此而减 1。也就是说,weak_ptr 类型指针并不会影响所指堆内存空间的引用计数。

    除此之外,weak_ptr 模板类中没有重载 * 和 -> 运算符,这也就意味着,weak_ptr 类型指针只能访问所指的堆内存,而无法修改它。

    1.weak_ptr指针的创建

    1.1 可以创建一个空 weak_ptr 指针:

    std::weak_ptr<int> wp1;

    1.2 凭借已有的 weak_ptr 指针,可以创建一个新的 weak_ptr 指针:

    std::weak_ptr<int> wp2 (wp1);

    若 wp1 为空指针,则 wp2 也为空指针;反之,如果 wp1 指向某一 shared_ptr 指针拥有的堆内存,则 wp2 也指向该块存储空间(可以访问,但无所有权)。

    1.3 weak_ptr 指针更常用于指向某一 shared_ptr 指针拥有的堆内存,因为在构建 weak_ptr 指针对象时,可以利用已有的 shared_ptr 指针为其初始化:

    1. std::shared_ptr<int> sp (new int);
    2. std::weak_ptr<int> wp3 (sp);

    由此,wp3 指针和 sp 指针有相同的指针。再次强调,weak_ptr 类型指针不会导致堆内存空间的引用计数增加或减少。

    2.weak_ptr模板类提供的成员方法

     3.举例

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. std::shared_ptr<int> sp1(new int(10));
    7. std::shared_ptr<int> sp2(sp1);
    8. std::weak_ptr<int> wp(sp2);
    9. //输出和 wp 同指向的 shared_ptr 类型指针的数量
    10. cout << wp.use_count() << endl;
    11. //释放 sp2
    12. sp2.reset();
    13. cout << wp.use_count() << endl;
    14. //借助 lock() 函数,返回一个和 wp 同指向的 shared_ptr 类型指针,获取其存储的数据
    15. cout << *(wp.lock()) << endl;
    16. return 0;
    17. }

    输出:

    1. 2
    2. 1
    3. 10

  • 相关阅读:
    Vue-cli项目及Element UI 环境搭建 保姆级教程
    外卖小程序:技术实现与关键代码
    【LeetCode】20. 有效的括号 - Go 语言题解
    MFC的定义和实际操作方法
    智慧城市项目建设介绍
    04-树6 Complete Binary Search Tree
    【Redis】深入探索 Redis 的数据类型 —— 无序集合 Set
    k8s简单架构图
    Liunx教程超详细(完整)
    如何选择合适的 API 网关
  • 原文地址:https://blog.csdn.net/weixin_42755079/article/details/127753453