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

c++中shared_ptr和unique_ptr的区别_两种智能指针所有权模型对比

下次还敢
发布: 2025-09-29 21:31:01
原创
774人浏览过
unique_ptr独占所有权,无运行时开销,析构时立即释放资源;shared_ptr共享所有权,通过引用计数管理,有额外内存和性能开销,需注意循环引用问题。

c++中shared_ptr和unique_ptr的区别_两种智能指针所有权模型对比

shared_ptrunique_ptr 是 C++ 中两种常用的智能指针,它们的核心区别在于所有权模型的不同,直接影响资源的管理和生命周期控制。

所有权语义不同

unique_ptr 实现独占式所有权。一个对象只能被一个 unique_ptr 持有,不能复制。如果需要转移所有权,必须使用 std::move。

例如:
  • unique_ptr<int> ptr1 = make_unique<int>(42);
  • unique_ptr<int> ptr2 = ptr1; // 错误:禁止复制
  • unique_ptr<int> ptr3 = std::move(ptr1); // 正确:转移所有权

此时 ptr1 变为空,ptr3 指向原对象。

shared_ptr 实现共享所有权。多个 shared_ptr 可以指向同一个对象,通过引用计数管理资源。当最后一个 shared_ptr 被销毁时,对象自动释放。

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

例如:
  • auto sp1 = make_shared<int>(100);
  • auto sp2 = sp1; // 合法:引用计数加1
  • sp1 和 sp2 共享同一对象,引用计数为2

性能与开销对比

unique_ptr 几乎没有运行时开销。它通常和裸指针大小一样,操作是零成本抽象,适合对性能敏感的场景。

释放由析构函数直接完成,无需额外数据结构。

标书对比王
标书对比王

标书对比王是一款标书查重工具,支持多份投标文件两两相互比对,重复内容高亮标记,可快速定位重复内容原文所在位置,并可导出比对报告。

标书对比王 58
查看详情 标书对比王

shared_ptr 有明显开销。除了指向对象的指针,还维护一个控制块(包含引用计数、弱引用计数等),分配内存更多,访问更慢。

每次复制或销毁都要原子操作修改引用计数,在多线程环境下成本更高。

适用场景建议

优先使用 unique_ptr,除非确实需要共享所有权。

  • 类内部管理独占资源时用 unique_ptr
  • 工厂函数返回值可用 unique_ptr 表示唯一所有权
  • 需要在多个地方共享且不确定谁最后使用时,用 shared_ptr
  • 观察者模式中配合 weak_ptr 避免循环引用

资源释放行为差异

unique_ptr 析构时立即释放资源,行为可预测,符合 RAII 原则。

shared_ptr 的释放时机依赖引用计数归零,可能延迟。若存在循环引用(如父子节点互相持有 shared_ptr),会导致内存泄漏,需用 weak_ptr 打破循环。

基本上就这些。选哪个取决于是否需要共享。不需要共享就用 unique_ptr,简单高效;需要共享再考虑 shared_ptr,但注意潜在开销和陷阱。

以上就是c++++中shared_ptr和unique_ptr的区别_两种智能指针所有权模型对比的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

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

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