当前位置: 首页 > news >正文

智能指针(2)

目录

答题格式:

几个易错点

可能问法四:

问题分析:

问题解答:


上回文说到,weak_ptr的功能和区别,并且进行了分析,我们接着进行解答。

答题格式:

int main()
{   
    std::weak_ptr<ListNode> wp;
    std::shared_ptr<ListNode> sp;

    {
        std::shared_ptr<ListNode> n1(new ListNode);
        wp = n1;
//虽然weak_ptr不支持直接管理资源,但是可以管理shared_ptr已经管理的空间,这边是直接拷贝了一个shared_ptr对象,也可以使用make_shared
        //weak_ptr会遇到引用失效的问题, 主要是因为引用对象被置空了,主要还是因为引用计数没有像shared_ptr那样及时更新的问题。然后其weak_ptr自己本身又没有析构函数无法及时释放
        cout << wp.expired() << endl;//expired判断会不会引用失效,如果失效了就是真的就会返回1,没有就会返回0
        n1->_data++;
        sp = wp.lock();
//lock的作用是放止引用消失,把wp的资源给跟他同生命周期的sp管理,防止其过期,因为shared_ptr一般不会出现引用失效的问题,所以这个lock就相当于讲weak_ptr提升为类型为shared_ptr的sp,这也说明了weak_ptr可以管理shared_ptr已经管理的资源相当于提升了。
    }
      cout << wp.expired() << endl;
//出了作用域n1销毁了,此时wp就指向了一个空的空间
                                   //就引用失效了,原本会输出1的,但是加上锁lock就不会了

    return 0;
}

所以结合上面代码答案如下:

上面提到的expired 和lock面试官没问就不必说了

几个易错点

1。这些智能指针在用的时候还是要加上头文件memory,这里你发现不加也没错主要是因为编译器隐式包含了。具体解释如下:

虽然VS对于某些语法的优化很厉害,但是这里绝对不会优化掉头文件的。所以还是带上比较好。

2。shared_ptr是不会出现引用失效的,因为它的引用计数是会变的,但是这里如果引用的是一个空的对象,也就是说shared_ptr为nullptr,那这里的引用计数就需要特殊处理的,实际是给0的,因为引用空的根本不需要管理。

3。weak_ptr是有引用计数的,属于弱引用,只是引用计数不会随着管理资源的改变而改变,也就是不增加引用计数。

可能问法四:

你知道什么是循环引用吗,怎么解决这种情况?

问题分析:

这个问题就是在考察shared_ptr的缺点已经weak_ptr的研发原因?属于背一背就可以了,最多就是将一个例子。

问题解答:

循环引用自然就是你引用着我,我又引用着你呗,你想释放资源,我引用着你,你得等我释放了才能释放,但是我想释放又被你引用着,这样绕来绕去就随都释放不了了。一下例子可做参考。

struct ListNode
{
    int _data;

    shared_ptr<ListNode> _next;
    shared_ptr<ListNode> _prev;
    ~ListNode()
    {
        cout << "~ListNode()" << endl;
    }
};

int main()
{
    // 循环引用 -- 内存泄露
    shared_ptr<ListNode> n1(new ListNode);
    shared_ptr<ListNode> n2(new ListNode);
    cout << n1.use_count() << endl;
    cout << n2.use_count() << endl;
    n1->_next = n2;
    n2->_prev = n1;
    cout << n1.use_count() << endl;
    cout << n2.use_count() << endl;
    //在循环的地方使用weak_ptr就不会出现这种问题
    //weak_ptr不支持管理资源,不支持RAII

    return 0;
}

可以看到引用计数正常增加了,结果无法正常析构。

下面解释一下为什么:

结论:照成这种原因的本质就是引用计数的正常增加导致内部循环的部分无法释放,所以解决问题的关键计数使得内部循环引用的部分的引用计数不会增加就可以了,这时weak_ptr不会增加引用计数的优势就体现了,只需要将链表内部循环的部分的管理的智能指针换成weak_ptr就可以了。

//weak_ptr<ListNode> _next;
//weak_ptr<ListNode> _prev;

相关文章:

智能指针(2)

目录 答题格式&#xff1a; 几个易错点 可能问法四&#xff1a; 问题分析&#xff1a; 问题解答&#xff1a; 上回文说到&#xff0c;weak_ptr的功能和区别&#xff0c;并且进行了分析&#xff0c;我们接着进行解答。 答题格式&#xff1a; int main() { std::we…...

[含文档+PPT+源码等]精品基于Nodejs实现的家教服务小程序的设计与实现

基于Node.js实现的家教服务小程序的设计与实现背景&#xff0c;主要源于以下几个方面&#xff1a; 一、家教市场的现状与需求 随着教育竞争的日益激烈&#xff0c;家庭对子女教育质量的重视程度不断提升&#xff0c;家教服务已成为许多家庭不可或缺的一部分。然而&#xff0c…...

electron打包报错-winCodeSign无法下载

electron打包报错-winCodeSign下载问题 问题描述 downloaded urlhttps://registry.npmmirror.com/-/binary/electron-builder-binaries/winCodeSign-2.6.0/winCodeSign-2.6.0.7z duration1.577s⨯ cannot execute causeexit status 2outerrorOutERROR: Cannot create s…...

给Windows系统设置代理的操作方法

一、什么是代理 网络代理是一种特殊的网络服务&#xff0c;允许一个网络终端通过这个服务与另一个网络终端进行非直接的连接&#xff0c;而提供代理服务的电脑系统或其它类型的网络终端被称为代理服务器。 代理服务器是网络信息的中转站&#xff0c;代理服务器就像是一个很大的…...

高质量带货短视频素材来源推荐

在抖音带货时&#xff0c;寻找高质量视频素材至关重要。今天&#xff0c;我为大家分享五个可以下载高清无水印带货短视频素材的网站&#xff0c;帮助你轻松获取灵感和素材&#xff01; 蛙学网 蛙学网作为国内领先的短视频素材平台&#xff0c;提供多种类的带货短视频素材。无论…...

torchvision.transforms.Resize()的用法

今天我在使用torchvision.transforms.Resize()的时候发现&#xff0c;一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面&#xff0c;torchvision.transforms.Resize((size,size))&#xff0c;大家都很清楚&#xff0c;会将图像的h和w大小都变成size。 但是…...

简单认识 redis -数据类型命令

一.Redis 键(key) 不能存在相同名称的key //SET KEY_NAME value 设置一个键 127.0.0.1:6379> set runoobkey redis OK 127.0.0.1:6379> get runoobkey redis "redis" //DEL KEY_NAME 删除键 127.0.0.1:6379> DEL redis (integer) 0 127.0.0.1:6379>…...

Python 语言学习——应用1.2 数字图像处理(第二节,变换)

目录 1.基础知识 1.图像几何变换概念 2.图像几何变换方式 3.插值运算 4.几何变换步骤 2.各类变换 1.位置变换 2.形状变换 3.代数运算 3.实战演练 1.基础知识 1.图像几何变换概念 在图像处理过程中&#xff0c;为了观测需要&#xff0c;常常需要对 图像进行几何变换&am…...

【QT Quick】页面布局:手动定位与坐标系转换

在这篇教程中&#xff0c;我们将详细介绍在 QT Quick 中如何手动定位元素以及坐标系转换的概念和应用。手动定位不仅仅是指定 x、y 坐标&#xff0c;更涉及坐标系的管理。我们会从最基本的手动定位开始&#xff0c;逐步扩展到更复杂的坐标系转换操作。 坐标系 默认坐标系&…...

uniapp自定义导航,全端兼容

我们在用uniapp 开发应用的时候&#xff0c;有的页面需要自定义导航&#xff0c; 1.如果普通的直接使用uni 扩展柜组件的 uni-nav-bar 也基本够用&#xff0c; 2.如果稍微带点自定义的这个值无法支持的&#xff0c;特别在小程序端&#xff0c;胶囊是会压住右边的按钮的 自定…...

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering

原文链接&#xff1a;http://arxiv.org/abs/1801.08163 启发&#xff1a;没太读懂这篇论文&#xff0c;暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY&#xff0c;模型有两个版本&#xff0c;Oracle和OCR。主要解决的问题是固定词表无…...

【PostgreSQL】实战篇——数据备份和恢复的最佳实践和工具

数据备份和恢复是确保数据安全性和可用性的关键环节。无论是由于硬件故障、软件错误、数据损坏还是人为错误&#xff0c;能够快速恢复数据都是保护业务连续性的重要措施。 PostgreSQL 提供了多种备份和恢复工具和方法&#xff0c;其中最常用的包括 pg_dump、pg_restore 和点时…...

代码随想录算法训练营第二十九天|93.复原IP地址 78.子集 90.子集II

93.复原IP地址 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"…...

【mysql】使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解

使用AbstractRoutingDataSource实现多数据源 与 获取mapper上注解 背景 随着业务发展速度越来越快&#xff0c;数据的增长也呈现倍数级别增长&#xff0c;数据库的压力&#xff0c;对于查询和写入等所有操作&#xff0c;都依赖于主库&#xff0c;其实有一些对于时效性要求不高…...

希沃冰点还原

要取消希沃冰点还原&#xff0c;可以按照以下步骤进行&#xff1a; 打开希沃冰点还原的应用或程序。 在应用或程序的界面上&#xff0c;寻找设置选项或菜单。 点击或选择设置选项或菜单&#xff0c;进入设置界面。 在设置界面上&#xff0c;查找“取消”或“停止”等相关选项…...

Hadoop服务端口号、Spark端口号、Hive端口号以及启动命令

文章目录 1. 服务端口号1.1 Hadoop相关的服务端口号1.2 Spark相关的服务端口号1.3 Hive的连接端口 2. 服务启动指令 1. 服务端口号 1.1 Hadoop相关的服务端口号 HDFS的web页面访问端口 9870HDFS 的程序访问端口 8020Yarn的访问端口 8088历史日志访问端口 19888 1.2 Spark相关…...

【C++】--类和对象(3)

&#x1f911;个人主页: 起名字真南 &#x1f911;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 深入构造函数2 类型转换3 static成员4 友元函数5 内部类6 匿名对象 1 深入构造函数 之前我们实现构造函数的时候&#xff0c;初始化成员变量都是在函数体内赋值&#xff0c…...

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中&#xff0c;有3台服务器的路径不是一样的&#xff0c;那么在这种情况下您就可以使用本功能&#xff0c;单独执行不一样的路径 点击【高级】上传...

【MongoDB】mongodb | 部署 | 常用命令

一、概述 基于mongodb的tcp连接无数据上报&#xff0c;服务器强踢监测。 物联网项目&#xff0c;tcp协议&#xff0c;基于4G卡&#xff0c;设备由于某些原因会断开重连&#xff0c;但是tcp没有断开&#xff0c;导致tcp持续累加&#xff0c;浪费资源。 建立机制&#xff1a; 当t…...

【Chrome浏览器插件--资源嗅探猫抓】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、资源嗅探插件---猫抓二、使用步骤总结 一、资源嗅探插件—猫抓 猫抓是一个浏览器插件&#xff0c;可以检测当前网页中的一些资源文件&#xff0c;可设置嗅探的…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...