C++之弱引用智能指针weak_ptr的验证

2023-11-14

目录

shared_ptr带来的问题:

标准库weak_ptr弱引用验证:

标准库中weak_ptr交叉引用的验证:


shared_ptr带来的问题:

        在交叉引用时,会造成堆上资源无法释放的问题。

        使用weak_ptr弱引用就可以打破这个交叉引用,因为weak_ptr不改变引用记数。

        但当用weak_ptr指针访问成员方法时,需加 lock 函数,提升为强引用。

        

标准库weak_ptr弱引用验证:

        头文件:#include <memory>

        自定义一个类用:

#include <iostream>
#include <memory>
using namespace std;

class A
{
public:
    A()
    {
        cout << "A的构造" << endl;
    }
    ~A()
    {
        cout << "A的析构" << endl;
    }
    void slots_function()
    {
        cout << "加油,挣大钱" << endl;
    }
};

        主函数:

int main()
{

//    验证弱引用
    //在栈上创建
    shared_ptr<A> ptr1 (new A);
    shared_ptr<A> ptr2 = ptr1;
    cout << ptr2.use_count() << endl;   //>>2

    weak_ptr<A> ptr3 = ptr1;
    cout << ptr2.use_count() << endl;   //>>2
    cout << ptr3.use_count() << endl;   //>>2   ,证明weak_ptr不改变计数
    cout << "----------------------1" << endl;

//    ptr3.slots_function();    //报错
    ptr3.lock()->slots_function();  //弱引用只能通过lock方法调用对象方法
    cout << "----------------------2" << endl;

    cout << ptr3.use_count() << endl;   //2
    cout << ptr3.expired() << endl;     //0     ,作用是判断use_count == 0,返回bool
    cout << "-----------------------3" << endl;

    //析构所有指针
    ptr1.~shared_ptr();
    ptr2.~shared_ptr();
    ptr3.~weak_ptr();
    cout << "---------------------4" << endl;

    cout << ptr3.use_count() << endl;   //0
    cout << ptr3.expired() << endl;     //1
    ptr3.lock()->slots_function();      //当count为零,虽然shared_ptr指向的堆区空间不能用,
    ptr2->slots_function();             //但栈上对象依然存在,shared_ptr的方法还能调用.

    return 0;
}

        运行结果:

        

标准库中weak_ptr交叉引用的验证:

        定义两个可相互引用的类:

#include <iostream>
#include <memory>
using namespace std;

class B;

class A
{
public:
    weak_ptr<B> ptr_b;
public:
    A()
    {
        cout << "A的构造" << endl;
    }
    ~A()
    {
        cout << "A的析构" << endl;
    }
    void slots_function()
    {
        cout << "加油,挣大钱" << endl;
    }
};

class B
{
public:
    weak_ptr<A> ptr_a;
public:
    B()
    {
        cout << "B的构造" << endl;
    }
    ~B()
    {
        cout << "B的析构" << endl;
    }

    //用于升级成强引用,调用别人的方法.
    shared_ptr<A> lock()
    {
        return   (shared_ptr<A>) ptr_a;
    }

    //可以在类中调用交叉对象的方法
    void signals()
    {
        shared_ptr<A> temp = ptr_a.lock();
        if(temp != nullptr)
        {
            temp->slots_function();
        }
    }

};

        主函数:

//    验证交叉引用
    shared_ptr<A> ptr4(new A);
    shared_ptr<B> ptr5(new B);

    cout << ptr4.use_count() << endl;   //1
    cout << ptr5.use_count() << endl;   //1
    ptr4->slots_function();     //有输出
    ptr5->signals();            //无输出,原因是还没有引用A类对象
    cout << "--------------1" << endl;

    //交叉引用
    ptr4->ptr_b = ptr5;
    ptr5->ptr_a = ptr4;
    cout << ptr4.use_count() << endl;   //1,因为类里交叉引用用的wek_ptr
    cout << ptr5.use_count() << endl;   //1,所以,并未让计数器增加
    cout << "---------------2" << endl;

    //调用自身方法可以
    ptr4->slots_function();
    ptr5->signals();
    cout << "--------------3" << endl;

//    ptr5->slots_function(); //错误,交叉引用后也不能直接调别人的方法,需加lock
    ptr5->lock()->slots_function();
    cout << ptr5.use_count() << endl;   //1

    return 0;

        运行结果:

        

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之弱引用智能指针weak_ptr的验证 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • js 正则表达式

    js 正则表达式 http tool oschina net regex https developer mozilla org zh CN docs Web JavaScript Guide Regular Expressions 11
  • 深入理解计算机系统-程序链接

    链接 就是将不同部分的代码和数据手机和组合成为一个单一文件的过程 这个文件可被加载到存储器并执行 链接过程可以在如下时间执行 编译时 在源代码翻译成机器代码时 加载时 程序被加载器加载到存储器并执行时 运行时 由应用程序去完成这个工作 OS
  • 笛卡尔积的解释和作用

    一 笛卡尔积的解释 例 给出二个域 假设集合A a b 集合B 0 1 2 则两个集合的笛卡尔积为 a 0 a 1 a 2 b 0 b 1 b 2 类似的例子有 如果A表示某学校学生的集合 B表示该学校所有课程的集合 则A与B的笛卡尔积表示
  • c语言浮点数出错_20192020第二学期C语言练习题03

    一 单选题 共100题 50分 1 若有定义int a 10 p a 则表达式p 5表示 A 元素a 5 的地址 B 元素a 6 的地址 C 元素a 5 的值 D 元素a 6 的值 正确答案 A 2 题号 8281若有定义 int aa 8
  • FFmpeg将编码后数据保存成mp4

    以下测试代码实现的功能是 持续从内存块中获取原始数据 然后依次进行解码 编码 最后保存成mp4视频文件 可保存成单个视频文件 也可指定每个视频文件的总帧数 保存多个视频文件 为了便于查看和修改 这里将可独立的程序段存放在单个函数中 1 线程
  • Android判断有无外置SD卡(TF卡),并读写文件

    转载来源 https blog csdn net qq 27061049 article details 94178875 1 相关方法说明 2 Android Manifest xml 添加权限
  • 自制USB-HUB一分四扩展器

    自制USB HUB一分四扩展器 电脑只有俩USB2 0接口 不够用 所以决定自己做一个 使用到的芯片是sl2 1a 考虑到是自己用 所以成本还是比较重要的 这款芯片价格便宜 而且做扩展器也是够用的 适用于USB2 0 下面是原理图 其实这个
  • 您的计算机已被.balckhoues-V-XXXXXXX勒索病毒感染?恢复您的数据的方法在这里!

    引言 网络威胁不断进化 勒索病毒成为了当今数字世界中的一大威胁 在这些恶意软件中 balckhoues V XXXXXXX 勒索病毒以其高级的加密技术和威胁手段引起了广泛关注 本文91数据恢复将深入介绍 balckhoues V XXXXX
  • RAS非对称加密,前端js加密,node后端解密,jsencrypt

    纯HTML引入jsencrypt js文件 node后端解密也是独立文件jsencryptnode js 前端加密 下面是公钥
  • 实战经验分享:如何通过HTTP代理解决频繁封IP问题

    在网络爬虫和数据采集等应用中 频繁遇到目标网站封锁或限制IP的情况是非常常见的 为了解决这个问题 使用HTTP代理是一种有效的方法 本文将与您分享一些实战经验 帮助您通过HTTP代理解决频繁封IP问题 确保您的数据采集工作顺利进行 一 了解
  • 查看Oracle数据库的用户名和密码

    运行 cmd 按如下输入命令 sqlplus as sysdba sysdba为超级用户 alter user 用户名 account unlock 解除锁定 必须带 号 注意用英文字符 alter user 用户名 identified
  • 网页版百度网盘倍速方法

    打开控制台在console中输入以下代码 videojs getPlayers video player html5player tech setPlaybackRate 2 然后回车即可 后面数字即为速度可以自由定义 附 打开控制台办法
  • Selenium Python2022(二)

    您可能需要在多种情况下针对不同的浏览器 例如Firefox Chrome Internet Explorer Edge 测试代码 跨不同浏览器测试网站的做法称为自动浏览器测试 要使用Selenium自动化测试执行自动浏览器测试 您应该在单元
  • 元宇宙时代超高清视音频技术白皮书关于流媒体协议和媒体传输解读

    流媒体协议 元宇宙业务场景对流媒体传输的实时性和互动性提出了更高的要求 这就需要在传统的 RTMP SRT HLS 等基础上增加实时互动的支持 实时互动 指在远程条件下沟通 协作 可随时随地接入 实时地传递虚实融合的多维信息 身临其境的交互
  • 数据可视化:在 React 项目中使用 Vega 图表 (二)

    上一篇讲了如何在 React 项目中用 Vega Lite 绘制基本的 area chart 图表 本篇将介绍如何绘制多层图表 如何添加图例 多层图表 通过上一篇文章 我们知道了可以通过 mark encoding 等来描述我们想要的图表
  • STM32F103ZET6【HAL函开发】STM32CUBEMX------7.DAC实验

    STM32F103ZET6有2 个 DAC 转换器 每个转换器对应 1 个输出通道 对应的IO口如下 DAC OUT1 PA4 DAC OUT2 PA5 目的 DAC通道2可以输出3 3以下的任意电压 同时通过ADC1通道8采集到 打印到串
  • Vue中div contenteditable 的光标定位

    在Vue做项目时 做了一个div contenteditable true 的组件作为文本输入框 在非手动输入值后 光标会丢失 经测试以下这段代码可用 直接将光标定位到最后 function keepLastIndex obj consol
  • 刷脸支付大量的商户正在大步踏进数字化

    传统的商业零售不缺乏客源 但是弊端在于 顾客和商家建立有效接触的时间太短 可能只有结账时的短短十秒左右 很多人都有过去便利店买东西 店员安利办会员卡的经历 但是绝大多数人只想尽快买单走人 商家想做进一步精准推进和营销实在难上加难 蜻蜓是首款
  • Python3,我把新年祝福写在“雨“中,你看,雨一直下,气氛还算融洽,在同个屋檐下....

    新年愿望写在 雨 中 1 引言 2 代码实战 2 1 模块介绍 2 1 1 Pygame 介绍 2 1 2 Pygame的display介绍 2 1 3 Pygame的event介绍 2 1 4 Pygame的font介绍 2 2 代码示例
  • C++之弱引用智能指针weak_ptr的验证

    目录 shared ptr带来的问题 标准库weak ptr弱引用验证 标准库中weak ptr交叉引用的验证 shared ptr带来的问题 在交叉引用时 会造成堆上资源无法释放的问题 使用weak ptr弱引用就可以打破这个交叉引用 因