新闻中心

c++中unique_ptr和shared_ptr的区别_C++智能指针类型对比

2025-11-18
浏览次数:
返回列表
unique_ptr独占所有权,轻量高效,不可拷贝只能移动;shared_ptr共享所有权,支持拷贝但有引用计数开销,适用于多所有者场景。

c++中unique_ptr和shared_ptr的区别_c++智能指针类型对比

在C++中,unique_ptrshared_ptr 都是智能指针,用于自动管理动态分配的内存,避免内存泄漏。它们的核心区别在于所有权模型和资源管理方式。

所有权语义不同

unique_ptr 实现独占所有权。同一时间只有一个 unique_ptr 可以指向某个对象。当 unique_ptr 被销毁或重置时,它所管理的对象也会被自动删除。

shared_ptr 实现共享所有权。多个 shared_ptr 可以指向同一个对象。只有当最后一个 shared_ptr 被销毁时,对象才会被释放。

性能开销差异

unique_ptr 几乎没有运行时开销,因为它不涉及引用计数。它的大小通常和原始指针一样,适合对性能要求高的场景。

shared_ptr 需要维护一个引用计数(控制块),每次拷贝或销毁都会更新计数,带来一定的性能损耗。它的内存占用也更大。

能否拷贝与传递

unique_ptr 不支持拷贝构造和拷贝赋值。只能通过 std::move 转移所有权:

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical unique_ptr p1 = make_unique(42);
unique_ptr p2 = std::move(p1); // p1 变为空,p2 拥有对象

shared_ptr 支持直接拷贝,每拷贝一次,引用计数加一:

shared_ptr p1 = make_shared(42);
shared_ptr p2 = p1; // 两者共享对象,引用计数为2

适用场景建议

使用 unique_ptr 当你需要明确的单一所有者,比如类成员管理资源、工厂函数返回对象等。它是默认首选。

使用 shared_ptr 当多个部分需要共享同一个对象生命周期时,例如观察者模式中的回调持有、树结构中父子节点互相引用(配合 weak_ptr)等。

基本上就这些。选哪个取决于你是否需要共享所有权。unique_ptr 更轻量高效,shared_ptr 更灵活但有代价。

以上就是c++++中unique_ptr和shared_ptr的区别_C++智能指针类型对比的详细内容,更多请关注其它相关文章!


# 互斥  # 莲湖区营销线上推广公司  # 小红书营销如何做推广员  # 开展商户营销推广  # 南海网站优化维护  # 品牌网站推广周密易速达  # 浙江华临建设集团网站  # seo删稿  # 地产营销推广费用占比  # 广丰区网站建设推广中心  # 乐昌网站建设制作报价  # 才会  # c++  # 也会  # 内存管理  # 都是  # 如何用  # 更快  # 多个  # 进阶  # 如何实现  # red  # 内存占用  # 区别 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  PHP 枚举:根据字符串获取枚举案例的策略与实现  steam官方网页快速访问 steam账号注册全流程  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  ACG动漫视频网入口 ACG动漫*免费正版观看地址  Linux如何构建多环境配置管理_Linux多环境配置方案  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  2025-2030年全球乘用车销量预测:新能源成增长主力  c++项目目录结构应该如何组织_c++工程化项目结构规范  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  机器学习中对数变换预测结果的反向还原  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  c++如何使用chrono库处理时间_c++标准库时间与日期操作  必由学官方网站入口 必由学学生教师共用登录通道  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  Python字典中优雅地迭代剩余元素的方法  韩小圈电脑版在线入口_网页版免费登录地址  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  Eclipse怎么运行工程_Eclipse工程运行配置说明  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  12306选座怎么选到临时改签座_12306改签选座策略与步骤  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  Win10双系统截图高效法 截屏快捷键速记【技巧】  菜鸟取件码是什么怎么查 最全查询渠道汇总  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  Go Martini框架:动态服务解码后的图片内容  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  mysql备份恢复性能优化_mysql备份恢复性能优化方法  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  单射、满射与双射的关系 一文理清所有逻辑  J*aScript map 迭代中检测空数组元素的有效方法  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  J*a里如何使用forEach遍历Map_Map遍历方法说明  Go语言中高效处理x-www-form-urlencoded表单数据 

搜索