现代C++——智能指针
1. std::shared_ptrstd::shared_ptr 是一种智能指针它能够记录多少个 shared_ptr 共同指向一个对象。delete当引用计数变为零的时候就会将对象自动删除。使用 std::shared_ptr 仍然需要使用 new 来调用这使得代码出现了某种程度上的不对称。std::make_shared 就能够用来消除显式的使用 new所以 std::make_shared 会分配创建传入参数中的对象并返回这个对象类型的 std::shared_ptr指针。例如#include iostream #include memory void foo(std::shared_ptrint i) { (*i); } int main() { auto pointer std::make_sharedint(10); foo(pointer); std::cout *pointer std::endl; // 结果是11 return 0; //出了作用范围后自动销毁 }std::shared_ptr 可以通过 get() 方法来获取原始指针通过 reset() 来减少一个引用计数并通过 use_count() 来查看一个对象的引用计数。例如auto pointer std::make_sharedint(10); auto pointer2 pointer; // 引用计数1 auto pointer3 pointer; // 引用计数1 int *p pointer.get(); // 这样不会增加引用计数 std::cout pointer.use_count() pointer.use_count() std::endl; // 3 std::cout pointer2.use_count() pointer2.use_count() std::endl; // 3 std::cout pointer3.use_count() pointer3.use_count() std::endl; // 3 pointer2.reset(); std::cout reset pointer2: std::endl; std::cout pointer.use_count() pointer.use_count() std::endl; // 2 std::cout pointer2.use_count() pointer2.use_count() std::endl; // pointer2 已 reset; 0 std::cout pointer3.use_count() pointer3.use_count() std::endl; // 2 pointer3.reset(); std::cout reset pointer3: std::endl; std::cout pointer.use_count() pointer.use_count() std::endl; // 1 std::cout pointer2.use_count() pointer2.use_count() std::endl; // 0 std::cout pointer3.use_count() pointer3.use_count() std::endl; // pointer3 已 reset; 0当使用 shared_ptr 的时候每添加一个指向同一个对象的指针就会增加一个计数这个计数是总计数所以在打印的第一部分会发现调用三个指针分别查看这个对象的引用数都是 3 。根据不同的指针使用 reset() 只会消除对应指针对这块内存的所有权第二处打印前对 p2 进行了减少计数的操作此时分别打印会发现 p1 和 p3 都是 2 而 p2 变成了 0。这是因为每个 shared_ptr 在添加的时候把一个数公共的加进了计数中所以 reset() 操作把自己对这块内存的所有权放弃后总计数就会减 1 。但是既然已经放弃了所有权所以 p2 就无法正常显示刚才那块内存的计数所以就显示 0。第三段打印时也是相同的原因。2. std::unique_ptrstd::unique_ptr 是一种独占的智能指针它禁止其他智能指针与其共享同一个对象从而保证代码的安全std::unique_ptrint pointer std::make_uniqueint(10); // make_unique 从 C14 引入 std::unique_ptrint pointer2 pointer; // 非法既然是独占那就是不可复制。但是我们可以利用 std::move 将其转移给其他的 unique_ptr例如#include iostream #include memory struct Foo { Foo() { std::cout Foo::Foo std::endl; } ~Foo() { std::cout Foo::~Foo std::endl; } void foo() { std::cout Foo::foo std::endl; } }; void f(const Foo ) { std::cout f(const Foo) std::endl; } int main() { //创造一个类型为 unique_ptrFoo 的智能指针 p1 初始化通过Foo的构造函数 std::unique_ptrFoo p1(std::make_uniqueFoo()); // p1 不空, 输出 if (p1) p1-foo(); { //通过 move 将 p1 转移给 p2 完成 p2 的初始化此时 p1 失去了这块内存的访问权 std::unique_ptrFoo p2(std::move(p1)); // p2 不空, 输出 f(*p2); // p2 不空, 输出 if(p2) p2-foo(); // p1 为空, 无输出 if(p1) p1-foo(); //再通过 move 把 p2 的所有权转给 p1 p1 std::move(p2); // p2 为空, 无输出 if(p2) p2-foo(); std::cout p2 被销毁 std::endl; } // p1 不空, 输出 if (p1) p1-foo(); // Foo 的实例会在离开作用域时被销毁 }3. std::weak_ptr如果你仔细思考 std::shared_ptr 就会发现依然存在着资源无法释放的问题。看下面这个例子class Child; class Parent { public: std::shared_ptrChild child; // 爸爸持有儿子的 shared_ptr ~Parent() { std::cout 爸爸走了\n; } }; class Child { public: std::shared_ptrParent parent; // 儿子持有爸爸的 shared_ptr ~Child() { std::cout 儿子走了\n; } }; int main() { auto dad std::make_sharedParent(); auto son std::make_sharedChild(); dad-child son; // 爸爸指向儿子计数儿子对象 2 (son dad-child) son-parent dad; // 儿子指向爸爸计数爸爸对象 2 (dad son-parent) // main 结束dad 和 son 销毁计数各自减为 1 // 内存泄漏两个对象互相抱着无法释放 }爸爸要等儿子走才走儿子要等爸爸走才走结果谁也走不了导致内存泄漏。解决这个问题的办法就是使用弱引用指针 std::weak_ptrstd::weak_ptr 是一种弱引用相比较而言 std::shared_ptr 就是一种强引用。class Child { public: std::weak_ptrParent parent; // 改成弱引用儿子知道有爸爸但不“拽着”爸爸不让走 ~Child() { std::cout 儿子走了\n; } };std::weak_ptr 没有 * 运算符和 - 运算符所以不能够对资源进行操作它可以用于检查std::shared_ptr 是否存在。使用 expired() 方法能在对象资源未被释放时返回 false否则返回 true 。除此之外还可以升级成强引用通过 lock() 可以升级成临时的 shared_ptr。

相关新闻

广州附医华南医院综合实力与诊疗服务可信度全解析

广州附医华南医院综合实力与诊疗服务可信度全解析

广州地区精神与神经类疾病就诊需求与痛点盘点近年来随着广州城市生活节奏加快,不同年龄段群体的精神与神经类疾病就诊需求持续上升。职场群体长期承受高压工作节奏,超半数受访者曾出现过连续1个月以上的睡眠质量下降、情绪低落或莫名焦虑的情况&#xff…

2026/8/6 6:59:07 阅读更多 →
win11 按下 alt 键后显示“正在转写” 故障

win11 按下 alt 键后显示“正在转写” 故障

最后定位是钉钉,取消使用AI语音输入。

2026/8/6 6:59:07 阅读更多 →
智汇华云 ——AIOps之动态阈值:SARIMA模型详解

智汇华云 ——AIOps之动态阈值:SARIMA模型详解

近些年来, IT运维人工智能也就是AIOps, 已然成了应对IT系统日益增长的复杂性的相当不错的解决办法, AIOps借助大数据、数据分析以及机器学习提供洞察力, 还为管理现代基础设施跟软件所需的任务给予更高水准的自动化(不依靠人类操作员)。所以, AIOps有着特…

2026/8/6 6:59:07 阅读更多 →

最新新闻

PyTorch深度学习实验可视化:TensorBoard核心API详解与工程实践

PyTorch深度学习实验可视化:TensorBoard核心API详解与工程实践

1. 项目概述:为什么我们需要TensorBoard 在PyTorch项目里埋头苦干,调参、改网络结构、跑实验,一跑就是几个小时甚至几天。结果出来了,看着命令行里打印的一行行损失值和准确率,是不是总觉得少了点什么?没错…

2026/8/6 8:21:55 阅读更多 →
电磁侧信道攻击实战:从原理到攻防,拆解硬件安全隐形杀手

电磁侧信道攻击实战:从原理到攻防,拆解硬件安全隐形杀手

1. 项目概述:当加密算法遇上“隔墙有耳” 在数字安全的世界里,我们常常把加密算法想象成一个坚不可摧的保险箱。无论是保护你的在线支付密码,还是确保国家间的机密通信,这些基于复杂数学难题的算法(如AES、RSA、ECC&am…

2026/8/6 8:21:55 阅读更多 →
深度解析天津市建设网站全流程及未来发展趋势展望

深度解析天津市建设网站全流程及未来发展趋势展望

在这个数字化浪潮席卷全球的时代,互联网早已不仅仅是信息的载体,更是商业逻辑重构、生活方式重塑以及城市形象展示的核心阵地。对于身处环渤海经济圈核心位置的天津来说,无论是传统的制造业巨头,还是新兴的电商创业公司,亦或者是致力于提升城市服务效能的政府机构,拥有一…

2026/8/6 8:21:55 阅读更多 →
推挽输出和开漏输出

推挽输出和开漏输出

长脚插PA0,短脚插负极,是高电平点亮,上面这个图是低电平点亮,谁在PA0谁是什么电平。

2026/8/6 8:21:55 阅读更多 →
工厂系统二次开发为什么越来越贵?问题往往出在前期规划

工厂系统二次开发为什么越来越贵?问题往往出在前期规划

开头很多工厂系统刚上线时费用看起来可控,用了一两年后却发现二次开发越来越贵:改一个字段要排期,加一个报表要报价,换一个流程要重新测试,接口稍微调整就牵动多个部门。表面看是开发费用问题,根本上往往是…

2026/8/6 8:21:55 阅读更多 →
SQLException 全链路排查:从连接失败到死锁的实战解决方案

SQLException 全链路排查:从连接失败到死锁的实战解决方案

1. 从“数据库连接失败”到“数据不一致”:一个SQLException的完整排查手册 干了这么多年后端开发,最怕半夜被报警电话吵醒,而十有八九,问题都出在数据库上,日志里躺着一个刺眼的 SQLException 。这玩意儿就像程序世…

2026/8/6 8:20:55 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →