如何正确使用C++的智能指针 unique_ptr和shared_ptr应用指南

小晨大大_6634

小晨大大_6634

2025-08-25

970人浏览

原创

c++oding="utf-8" ?>

c++智能指针中unique_ptr适用于资源唯一所有权场景,如确保单所有者、利用raii自动管理资源,且不可复制但可移动;shared_ptr适用于共享所有权场景,通过引用计数自动释放资源,适合多模块访问或不确定生命周期的对象;选择时若对象归属单一用unique_ptr,需共享则用shared_ptr,并优先使用make_unique和make_shared,避免循环引用和裸指针问题。

如何正确使用C++的智能指针 unique_ptr和shared_ptr应用指南

C++的智能指针是现代C++编程中管理动态内存的重要工具,能有效避免内存泄漏和资源管理问题。其中

unique_ptr

和

shared_ptr

是最常用的两种。正确使用它们,可以让你写出更安全、简洁的代码。

如何正确使用C++的智能指针 unique_ptr和shared_ptr应用指南

一、什么时候用
unique_ptr
?

unique_ptr

表示对资源的唯一所有权,也就是说同一时间只能有一个指针指向这个对象。它不能复制,但可以移动(move)。

如何正确使用C++的智能指针 unique_ptr和shared_ptr应用指南

适用场景:

  • 需要确保只有一个所有者
  • 不想手动释放内存
  • 想利用RAII机制自动管理资源

举个例子,如果你写一个函数返回一个动态创建的对象,可以用

unique_ptr

来保证调用方不会忘记delete:

如何正确使用C++的智能指针 unique_ptr和shared_ptr应用指南
std::unique_ptr<myclass> createObject() {
    return std::make_unique<myclass>();
}</myclass></myclass>

这样,调用方拿到的是一个智能指针,出了作用域会自动释放。

建议:

  • 尽量优先使用
    make_unique
    而不是裸new,更安全也更清晰
  • 如果你需要把对象传给另一个函数,并且不打算再用了,就用
    std::move
  • 不要用多个
    unique_ptr
    指向同一个资源,这会导致编译错误

二、什么时候用
shared_ptr
?

shared_ptr

是共享所有权的智能指针,内部通过引用计数来跟踪有多少个指针指向同一个对象。当最后一个

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
shared_ptr

被销毁时,对象才会被释放。

适用场景:

  • 多个地方需要访问同一个对象
  • 对象生命周期不确定,需要自动管理
  • 实现观察者模式、缓存等结构时很有用

比如你有一个对象被多个模块使用,这时候用

shared_ptr

就很合适:

auto obj = std::make_shared<myclass>();
auto copy = obj; // 引用计数加1</myclass>

建议:

  • 同样优先使用
    make_shared
    ,性能更好,也能减少内存碎片
  • 注意循环引用的问题:A持有B的
    shared_ptr
    ,B也持有A的,会导致内存泄漏。这时候可以用
    weak_ptr
    解决
  • 不要把裸指针交给多个
    shared_ptr
    管理,否则会重复释放,造成崩溃

三、如何选择 unique_ptr 和 shared_ptr?

这个问题其实很常见,简单来说:

  • 如果你能确定对象只属于一个所有者,用
    unique_ptr
  • 如果多个部分都要用到这个对象,或者不知道谁最后用完,用
    shared_ptr

一些判断点:

  • 是否需要多处访问?
  • 是否需要转移所有权?
  • 是否担心忘记释放?

如果以上问题大部分是否定的,那

unique_ptr

就够用了。

另外还有一个技巧:即使一开始只需要一个所有者,也可以先用

unique_ptr

,将来如果需要共享了,再换成

shared_ptr

。反过来就不容易改了。


基本上就这些。掌握好这两个智能指针的使用场景和注意事项,能大大提升代码的安全性和可维护性。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

379

31

数据库Delete用法
数据库Delete用法

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

2023.11.13

3371

4

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

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

2023.12.29

1025

3

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

20

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
DBeaver生态工具dbvr官方手册
DBeaver生态工具dbvr官方手册

共0课时 | 0人学习

Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习