新闻中心
c++智能指针shared_ptr和unique_ptr如何选择_c++智能指针用法与差异说明
优先选择 std::unique_ptr,因其独占所有权、无性能开销,适用于大多数场景;当需要多个指针共享同一对象所有权时,再选用std::shared_ptr,但需注意引用计数带来的开销及循环引用风险。

选择 std::shared_ptr 还是 std::unique_ptr,关键在于对象所有权的管理方式。如果你需要多个指针共享同一个对象的所有权,就用 shared_ptr;如果只需要一个指针独占对象,就用 unique_ptr。
std::unique_ptr:独占所有权
std::unique_ptr 表示对所指向对象的唯一所有权。它不能被复制,只能通过移动语义转移所有权。这使得资源管理高效且安全,几乎没有运行时开销。
适合以下场景:
- 类内部管理一个动态分配的对象,且不希望与其他对象共享
- 函数返回一个新创建的对象,调用方接管所有权
- 替代裸指针或 auto_ptr(已废弃)
示例:
std::unique_ptr<int> ptr1 = std::make_unique<int>(42); // ptr2 = ptr1; // 错误:不能复制 std::unique_ptr<int> ptr2 = std::move(ptr1); // 正确:转移所有权
std::shared_ptr:共享所有权
std::shared_ptr 使用引用计数来管理对象生命周期。每当有一个新的 shared_ptr 指向同一对象时,引用计数加一;当 shared_ptr 析构时,计数减一;计数为零时,自动释放对象。
适合以下情况:
Musho
AI网页设计Figma插件
76
查看详情
- 多个部分需要访问并共同管理同一个对象
- 回调机制中传递对象,无法确定谁最后使用
- 缓存、观察者模式等需要长期持有对象的场景
示例:
auto sp1 = std::make_shared<int>(100); auto sp2 = sp1; // 引用计数变为2 // 两者都有效,直到最后一个离开作用域
性能与开销对比
unique_ptr 几乎没有额外开销,它和裸指针大小一样,操作是零成本抽象。而 shared_ptr 需要维护引用计数控制块,带来内存和性能上的成本:
- 每个 shared_ptr 实例比裸指针大(通常两倍)
- 构造、赋值、析构都有原子操作开销(线程安全)
- 控制块单独分配,可能影响缓存局部性
如何选择?实用建议
按这个顺序思考:
- 默认使用 unique_ptr —— 大多数情况下就够了
- 只有在确实需要共享所有权时才改用 shared_ptr
- 避免循环引用:如果两个 shared_ptr 相互持有,会导致内存泄漏,此时可用 weak_ptr 打破循环
- 工厂函数返回 unique_ptr,接收方可根据需要转为 shared_ptr
基本上就这些。优先选 unique_ptr,简单高效;真需要共享再用 shared_ptr。不复杂但容易忽略。
以上就是c++++智能指针shared_ptr和unique_ptr如何选择_c++智能指针用法与差异说明的详细内容,更多请关注其它相关文章!
# 如果你
# 珠海网站推广招聘公司
# 单体架构网站优化
# 长宁营销推广中心地址电话
# wap网站建设是什么
# 台州网站建设便宜的公司
# 蒙阴全网营销推广公司
# 英语网站建设费
# 抖音全城营销怎么做推广
# 莆田市网站seo优化联系方式
# 网站建设常用布局方法
# 都有
# c++
# 运算符
# 尼克
# 几乎没有
# 就用
# 自定义
# 数据结构
# 多个
# 如何选择
# red
# 作用域
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
windows10怎么关闭系统提示音_windows10彻底静音设置方法
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
快手极速版在线观看 官方网页版登录地址
J*a实现学校排课程序_面向对象结构化项目示例
整合Supabase认证与Django模型:跨模式迁移的解决方案
在Socket.IO连接中实现Access Token自动更新与动态重连
在Go Martini框架中高效服务动态生成图像的实践指南
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】
将HTML Canvas内容转换为可上传的图像文件(File对象)
小米Civi 4录制视频过暗_小米Civi 4亮度优化
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
海棠账号登录入口_登录海棠账户同步阅读记录
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
菜鸟取件码是什么怎么查 最全查询渠道汇总
Python多线程中正确使用sigwait处理SIGALRM信号
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
如何在网页中实现特定地点的随机图片展示
j*a toString()的覆盖
J*aScript中赋值与自增运算符的复杂交互与执行机制
优化大型XML文件解析:基于Python流式处理的内存高效方案
Mac怎么查看崩溃日志_Mac控制台错误报告分析
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项
Django通过AJAX异步上传图片并保存至模型的完整指南
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
小红书网页版入口链接分享 小红书官网直接进
yy漫画网页版官方入口_yy漫画官网登录页面链接
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
composer的"require-dev"部分是用来做什么的?
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
React Router v6 教程:构建认证保护的私有路由与重定向策略
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
fishbowl官网免费版 fishbowl养鱼网站入口
绝地鸭卫平a核爆刀流玩法攻略


2025-10-31
浏览次数:次
返回列表