• C++智能指针之weak_ptr


    C++智能指针之weak_ptr


    前言

      在C++中,动态内存的申请和释放是通过运算符:new 和 delete 进行管理的。其中 new 负责申请内存,delete负责释放内存。

      动态内存的使用很容易出现问题,这主要在于你需要保证在正确的时间释放内存,这是比较困难的,如果你忘记释放内存,就会造成内存泄露;有时在还有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。

      为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针类型来管理动态对象,智能指针的行为类似普通指针,最主要的区别在于它负责自动释放所指向的对象。这两种智能指针都定义在 memory 头文件内。

    • 本文是对于weak_ptr的分析。

    weak_ptr

      weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象
    拥有“弱”共享的特点。

      当weak_ptr指向一个shared_ptr类所指向的对象时,该对象的引用计数不会增加,因此,当最后一个对象的最后一个shared_ptr类被释放时,该对象会被释放。即使此时仍有weak_ptr指向该对象,该对象的内存仍然会被释放。

    常用方法

    在这里插入图片描述

    weak_ptr类的基本使用

    • 我们需要用一个shared_ptr类来初始化weak_ptr类
    auto p=make_shared<int>(42);  //初始化一个shared_ptr对象
    weak_ptr<int> wp(p); //用p初始化wp,wp弱共享p
    //wp只是指向p所指的对象,p的引用计数没有改变,并且p所指对象的释放也与wp无关
    
    • 1
    • 2
    • 3

    lock函数的使用

      由于对象可能不存在。我们不能使用 weak_ptr 直接访问对象,而必须调用lock。

    • 此函数用来检测weak_ptr所指的对象是否仍然存在,如果存在lock就返回一个指向共享对象的shared_ptr,不存在则做相应的处理。

    • 如果weak_ptr所指的shared_pre引用计数为0,返回一个空的shared_ptr

    • 否则,返回一个shared_ptr对象

    auto p=make_shared<int>(42);  
    weak_ptr<int> wp(p); 
    if(shared_ptr<int> np=wp.lock())
    {
        ...//如果np不为空则执行if
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结

    期待大家和我交流,留言或者私信,一起学习,一起进步!

  • 相关阅读:
    C++ 入门防爆零教程(上册)
    element-ui在vue中如何实现校验两个复选框至少选择一个!
    springcloudalibaba架构(29): Seata分布式事务(AT模式)
    大数据在智慧城市建设中的应用
    基于Docker的ROS开发
    EXCEL——计算数据分散程度的相关函数
    一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition
    Linux命令
    2024江苏专转本流程与时间节点
    git commit 校验
  • 原文地址:https://blog.csdn.net/CltCj/article/details/128058294