0

0

C++中如何选择合适的智能指针?shared_ptr与unique_ptr场景分析【内存管理】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-21 17:34:02

|

327人浏览过

|

来源于php中文网

原创

选智能指针应依据资源所有权设计:1. unique_ptr用于独占资源,轻量且禁拷贝;2. shared_ptr用于共享资源,需防循环引用;3. 裸指针仅作观察,所有权必须统一清晰。

c++中如何选择合适的智能指针?shared_ptr与unique_ptr场景分析【内存管理】

选智能指针不是看哪个“高级”,而是看资源所有权怎么分——谁该拥有、能否共享、是否需要转移,这三点理清了,unique_ptrshared_ptr 就不会用混。

用 unique_ptr:资源只能有一个主人

当你确定某块内存(或文件句柄、socket等)在任意时刻只属于一个对象,且不打算把它“借出去”或“复制给别人”,unique_ptr 就是首选。它轻量(无引用计数开销)、移动语义明确、析构自动,还禁止拷贝——这些都在帮你守住“独占”契约。

  • 函数返回动态对象?直接返回 unique_ptr,所有权自然移交,不用 new + 手动 delete
  • 类成员管理私有资源?用 unique_ptr 替代裸指针,构造/析构自动对齐,异常安全
  • 容器里存一堆动态对象?vector>vector 安全得多,清空容器即释放全部资源

用 shared_ptr:多个地方需要“共同拥有”同一份资源

当不同模块、不同生命周期的对象都需要访问同一块资源,并且谁都无法单方面决定它何时销毁(比如观察者模式里的被观察对象、缓存中的共享数据、异步任务中跨线程传递的上下文),这时才轮到 shared_ptr 出场。

  • 注意循环引用:两个 shared_ptr 相互持有(如父子节点、回调绑定),会导致引用计数永远不归零;改用 weak_ptr 打断环
  • 避免从裸指针反复构造:shared_ptr(new T) 不安全,推荐 make_shared() —— 一次分配、更高效、异常安全
  • 不要把 shared_ptr 当作“懒人 delete”滥用;它带运行时开销(原子计数、控制块内存),不该用来替代本该独占的场景

别用 raw pointer 管理所有权,也别混用智能指针和裸指针接管同一资源

int* p = new int(42); shared_ptr sp(p); 是危险操作——裸指针可能被提前 delete,或者被另一个 shared_ptr 二次接管,引发未定义行为。所有权必须统一、清晰、无歧义。

AdsGo AI
AdsGo AI

全自动 AI 广告专家,助您在数分钟内完成广告搭建、优化及扩量

下载

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

  • 裸指针只用于“观察”或“临时访问”:函数参数、返回值(非所有权)、迭代器内部实现等
  • 一旦涉及 new / malloc / fopen / CreateFile 等资源获取,立刻交给智能指针(或 RAII 封装类)
  • 第三方库返回裸指针?查文档确认所有权归属;若它声称“你负责释放”,就用 unique_ptr + 自定义 deleter 接管

基本上就这些。不复杂,但容易忽略——关键不在语法,而在设计时想清楚:这份资源,到底归谁管?能分给别人吗?什么时候放手?想清楚了,unique_ptrshared_ptr 就各司其职,内存管理反而变得踏实。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

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

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

269

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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