首页 > 后端开发 > C++ > 正文

C++中如何选择合适的智能指针?shared_ptr与unique_ptr场景分析【内存管理】

裘德小鎮的故事
发布: 2025-12-21 17:34:02
原创
327人浏览过
选智能指针应依据资源所有权设计:1. unique_ptr用于独占资源,轻量且禁拷贝;2. shared_ptr用于共享资源,需防循环引用;3. 裸指针仅作观察,所有权必须统一清晰。

c++中如何选择合适的智能指针?shared_ptr与unique_ptr场景分析【内存管理】

选智能指针不是看哪个“高级”,而是看资源所有权怎么分——谁该拥有、能否共享、是否需要转移,这三点理清了,unique_ptrshared_ptr 就不会用混。

用 unique_ptr:资源只能有一个主人

当你确定某块内存(或文件句柄、socket等)在任意时刻只属于一个对象,且不打算把它“借出去”或“复制给别人”,unique_ptr 就是首选。它轻量(无引用计数开销)、移动语义明确、析构自动,还禁止拷贝——这些都在帮你守住“独占”契约。

  • 函数返回动态对象?直接返回 unique_ptr,所有权自然移交,不用 new + 手动 delete
  • 类成员管理私有资源?用 unique_ptr 替代裸指针,构造/析构自动对齐,异常安全
  • 容器里存一堆动态对象?vector<unique_ptr>></unique_ptr>vector<t></t> 安全得多,清空容器即释放全部资源

用 shared_ptr:多个地方需要“共同拥有”同一份资源

当不同模块、不同生命周期的对象都需要访问同一块资源,并且谁都无法单方面决定它何时销毁(比如观察者模式里的被观察对象、缓存中的共享数据、异步任务中跨线程传递的上下文),这时才轮到 shared_ptr 出场。

  • 注意循环引用:两个 shared_ptr 相互持有(如父子节点、回调绑定),会导致引用计数永远不归零;改用 weak_ptr 打断环
  • 避免从裸指针反复构造:shared_ptr<t>(new T)</t> 不安全,推荐 make_shared<t>()</t> —— 一次分配、更高效、异常安全
  • 不要把 shared_ptr 当作“懒人 delete”滥用;它带运行时开销(原子计数、控制块内存),不该用来替代本该独占的场景

别用 raw pointer 管理所有权,也别混用智能指针和裸指针接管同一资源

int* p = new int(42); shared_ptr<int> sp(p);</int> 是危险操作——裸指针可能被提前 delete,或者被另一个 shared_ptr 二次接管,引发未定义行为。所有权必须统一、清晰、无歧义。

巧文书
巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 281
查看详情 巧文书

立即学习C++免费学习笔记(深入)”;

  • 裸指针只用于“观察”或“临时访问”:函数参数、返回值(非所有权)、迭代器内部实现等
  • 一旦涉及 new / malloc / fopen / CreateFile 等资源获取,立刻交给智能指针(或 RAII 封装类)
  • 第三方库返回裸指针?查文档确认所有权归属;若它声称“你负责释放”,就用 unique_ptr + 自定义 deleter 接管

基本上就这些。不复杂,但容易忽略——关键不在语法,而在设计时想清楚:这份资源,到底归谁管?能分给别人吗?什么时候放手?想清楚了,unique_ptrshared_ptr 就各司其职,内存管理反而变得踏实。

以上就是C++中如何选择合适的智能指针?shared_ptr与unique_ptr场景分析【内存管理】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号