C++ 智能指针 shared_ptr /unique_ptr/weak_ptr
一 unique_ptr独占智能指针独占所有权同一时间只能有一个unique_ptr指向这块堆内存禁止拷贝只允许移动。不能拷贝unqiue_ptrint p2 p1编译报错可以移动unique_ptrint p2 move(p1)移动后p1变成空p2接管资源生命周期出作用域自动调用delete释放内存示例代码#include iostream #include memory using namespace std; int main() { // 创建unique_ptr管理堆上int unique_ptrint p1(new int(100)); cout *p1 endl; // unique_ptrint p2 p1; // ❌ 编译报错禁止拷贝独占 unique_ptrint p2 move(p1); // ✅ 移动所有权 cout *p2 endl; // p1 现在是空指针不能再使用*p1 return 0; } // 出作用域p2销毁自动释放堆内存不用手动delete要点1.底层析构的时候直接释放内存没有引用计数开销很小2.适用场景资源只需要一个管理者绝大多数场景优先用unique_ptr3.C14推荐写法auto p make_uniqueint(100)二 shared_ptr共享智能指针共享所有权维护引用计数每多一个shared_ptr指向同一块内存计数1对象析构计数-1引用计数减到0释放堆内存。引用计数单独存放在堆上不是存在对象内部拷贝允许拷贝时引用计数1移动原指针置空计数不变示例代码#include iostream #include memory using namespace std; int main() { shared_ptrint p1 make_sharedint(200); // 计数1 cout p1.use_count() endl; // use_count查看引用计数 shared_ptrint p2 p1; // ✅ 允许拷贝共享资源计数2 cout p2.use_count() endl; p1.reset(); // p1放弃管理计数1 cout p2.use_count() endl; return 0; } // 函数结束p2析构计数变成0释放内存致命问题循环引用内存泄漏两个对象ABA里面存shared_ptrBB里面存shared_ptr A持有BB持有A。两个对象析构的时候引用计数都减到1永远不为0内存永远不释放。struct B; struct A{ shared_ptrB b_ptr; ~A(){cout A析构endl;} }; struct B{ shared_ptrA a_ptr; ~B(){cout B析构endl;} }; int main() { shared_ptrA a make_sharedA(); shared_ptrB b make_sharedB(); a-b_ptr b; b-a_ptr a; // 出maina、b析构但是内部互相持有引用计数1 // A、B的析构函数**不会执行内存泄漏** return 0; }运行结果不会打印A析构B析构内存泄漏解决方案把其中一个shared_ptr改为weak_ptr三 weak_ptr弱引用不增加shared_ptr的引用计数不拥有资源只是“旁观”shared_ptr管理的对象weak_ptr不能直接解引用访问对象必须调用.lock()返回一个临时shared_ptrlock()底层是如何操作的拿到 weak_ptr 保存的控制块地址weak_ptr 内部只存控制块指针 对象指针不持有对象原子操作读取 use_count判断use_count 0如果 use_count 0对象已经被释放 → 直接返回空的shared_ptr如果 use_count 0尝试原子地把 use_count 1原子防止多线程并发释放构造一个新的 shared_ptr把对象指针、控制块指针交给这个新 shared_ptr 返回整个过程是原子的防止多线程下 “判断完还没加计数对象就被别的线程释放”可以用.expired()判断资源是否已经被释放专门解决shared_ptr循环引用问题修复上面循环引用代码把A内部的shared_ptrB改为weak_ptrB#include iostream #include memory using namespace std; struct B; struct A{ weak_ptrB b_ptr; // 弱指针不增加引用计数 ~A(){cout A析构endl;} }; struct B{ shared_ptrA a_ptr; ~B(){cout B析构endl;} }; int main() { shared_ptrA a make_sharedA(); shared_ptrB b make_sharedB(); a-b_ptr b; // weak_ptr赋值b的引用计数不会1 b-a_ptr a; return 0; } // 输出A析构 B析构内存正常释放当main函数结束1.b析构B内部a_ptr计数减1a的引用计数变成0-A对象释放2.A释放后weak_ptr自动失效没有指针再持有BB的引用计数变成0-B释放。使用weak_ptr访问对象示例shared_ptrint s make_sharedint(666); weak_ptrint w s; // cout *w; // ❌ weak_ptr不能直接解引用 shared_ptrint tmp w.lock(); // 拿到临时shared_ptr if(tmp ! nullptr) { cout *tmp endl; }

相关新闻

huashu-art-motion 纯代码合成配乐完全教程:零采样、BPM网格,用 Python 做出15秒卡点音乐

huashu-art-motion 纯代码合成配乐完全教程:零采样、BPM网格,用 Python 做出15秒卡点音乐

huashu-art-motion 纯代码合成配乐完全教程:零采样、BPM网格,用 Python 做出15秒卡点音乐 【免费下载链接】huashu-art-motion 艺术动画skill:35种艺术风格、9种解说语法,用代码让画动起来。 项目地址: https://gitcode.com/gh_…

2026/10/9 2:48:45 阅读更多 →
Vibe Coding 网站部署保姆级教程:从服务器、域名到 CloudBase 的完整落地路径

Vibe Coding 网站部署保姆级教程:从服务器、域名到 CloudBase 的完整落地路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 2:47:45 阅读更多 →
教育年限数据库跨版本对齐:年龄组、性别与五年间隔怎么处理

教育年限数据库跨版本对齐:年龄组、性别与五年间隔怎么处理

教育成就面板看起来像一张“国家—年份—教育年限”表,但公开页面展示的结构远比这复杂。DeepSData 的 Barro-Lee 资料描述其覆盖 146 个经济体、1950—2015 年、五年间隔,并按性别和年龄组组织受教育程度信息;内容还涉及教育层级占比、平均受…

2026/10/9 2:47:45 阅读更多 →

最新新闻

FreqFiles:JetBrains插件以访问频率为核心打造自动更新的高频文件导航面板

FreqFiles:JetBrains插件以访问频率为核心打造自动更新的高频文件导航面板

平时做开发最烦的是什么?不是需求改得乱七八糟,也不是线上Bug复现不了,而是明明代码就在那个文件里,你却要在文件树里一层一层展开,或者点开CtrlE发现最近文件列表全是一堆配置和日志文件,真正的核心文件被…

2026/10/9 3:24:08 阅读更多 →
内网私有化部署实战:用Sealos离线交付K8s云平台

内网私有化部署实战:用Sealos离线交付K8s云平台

上个月接了一个内网交付,客户要求把研发团队的 PaaS 环境整体搬到隔离网络里,公网不碰,半天之内要能跑业务。以前遇到这种需求,我第一反应是 OpenStack,或者老老实实手动拉 K8s 集群。但这次我直接用 Sealos 做私有化部…

2026/10/9 3:24:08 阅读更多 →
MetaGPT生产化实战:Coding Agent架构设计与商业落地

MetaGPT生产化实战:Coding Agent架构设计与商业落地

先说一个让我印象很深的案例。有一次我在开发者社区里看到一款基于MetaGPT思路改造的Coding Agent产品,这个项目没有花钱投放过任何广告,上线之后完全靠开发者社区的口碑转发,在几个月内做到了让我一度怀疑数据的收入体量。虽然这样的成绩不是…

2026/10/9 3:24:08 阅读更多 →
FreqFiles插件实战:JetBrains IDE高频文件一步直达

FreqFiles插件实战:JetBrains IDE高频文件一步直达

我用了两年 FreqFiles 之后,第一反应是怪自己:为什么没早点装这个 JetBrains 插件。每天在 IDEA、PyCharm 里切文件,按理说 IDE 已经有 Recent Files 和标签栏了,可实际用起来,要么被一堆临时打开的无关文件塞满&#…

2026/10/9 3:24:08 阅读更多 →
UDS 诊断服务 - 0x7B

UDS 诊断服务 - 0x7B

等待更新…

2026/10/9 3:24:08 阅读更多 →
用Iris数据集快速跑通SVM分类全流程

用Iris数据集快速跑通SVM分类全流程

简介:本资源是一份面向机器学习初学者与课程实践者的Python支持向量机(SVM)教学实践包,聚焦经典Iris鸢尾花数据集的二分类与多分类建模任务,完整覆盖算法实现、结果可视化与实验分析全流程。压缩包共16个文件&#xff…

2026/10/9 3:23:07 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →