0

0

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

P粉602998670

P粉602998670

发布时间:2025-07-14 11:19:02

|

793人浏览过

|

来源于php中文网

原创

c++++中的智能指针用于管理动态内存,避免内存泄漏和手动delete的问题。最常用的两种是unique_ptr和shared_ptr。1. unique_ptr独占资源所有权,不可复制但可转移,适合单一指针管理资源的场景;2. shared_ptr采用引用计数,允许多个指针共享资源,适合资源共享或生命周期不确定的情况。选择时根据资源是否需要共享决定,同时注意循环引用问题,推荐使用make_unique和make_shared创建,并避免用裸指针初始化多个智能指针。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

智能指针是C++中非常实用的工具,尤其在管理动态内存方面。它们能帮助我们避免内存泄漏和手动delete带来的问题。STL中的unique_ptr和shared_ptr是最常用的两种智能指针,它们各自有不同的使用场景和特点。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

unique_ptr:独占所有权

unique_ptr 的最大特点是独占资源所有权。也就是说,同一时间只能有一个 unique_ptr 指向某个对象,不能复制,但可以转移(move)所有权。

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析

适合场景:

  • 你希望某个资源只能被一个指针管理。
  • 需要明确资源生命周期,避免多个指针同时访问造成混乱。
  • 在类内部封装资源时,确保外部无法随意共享或拷贝。

使用建议:

怎样正确使用STL智能指针 unique_ptr shared_ptr应用场景解析
  • 创建方式通常为 std::make_unique(),简洁又安全。
  • 不要尝试拷贝 unique_ptr,会编译报错。
  • 可以通过 std::move() 把资源转移到另一个 unique_ptr 中。

举个例子:

Jobright
Jobright

专为北美求职者设计的AI求职助手平台

下载
auto ptr1 = std::make_unique(10);
// auto ptr2 = ptr1; // 编译错误!不能拷贝
auto ptr2 = std::move(ptr1); // 正确,ptr1现在为空

shared_ptr:共享所有权

shared_ptr引用计数型智能指针,多个 shared_ptr 可以指向同一个对象,当最后一个指向它的指针被销毁时,资源才会释放。

适合场景:

  • 多个对象需要共享一个资源,比如共享缓存、配置数据等。
  • 资源的生命周期不确定,由所有持有者共同决定。
  • 回调机制中传递资源,避免提前释放。

使用建议:

  • 推荐使用 std::make_shared() 创建,效率更高。
  • 注意循环引用问题,可能导致内存泄漏。
  • 可以用 weak_ptr 来打破循环依赖。

例如:

auto sp1 = std::make_shared(20);
{
    auto sp2 = sp1; // 引用计数加1
} // sp2离开作用域,引用计数减1,但sp1还在,资源未释放

如何选择?几个判断点

  • 如果资源只需要被一个地方使用,并且生命周期清晰,优先选 unique_ptr
  • 如果多个地方需要共享资源,或者不确定谁最后释放,就用 shared_ptr
  • 尽量避免裸指针 new/delete,交给智能指针处理。
  • 如果有父子结构、树形结构等容易形成循环引用的地方,记得搭配 weak_ptr 使用。

小细节注意

  • make_uniquemake_shared 不仅写法简单,还能避免异常安全问题。
  • 不要用同一个裸指针初始化多个智能指针,这样会导致重复释放。
  • 对于数组资源,unique_ptr 支持数组形式 unique_ptr,而 shared_ptr 需要自定义删除器。

基本上就这些。合理使用智能指针,能大大提升代码的安全性和可维护性。

相关专题

更多
数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

28

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

146

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

120

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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