C++智能指针

前置基础:裸指针、new/delete、类与对象

核心学习目标:掌握智能指针原理、三类智能指针用法及场景,解决裸指针内存问题

一、为什么需要智能指针

常规裸指针三大致命问题:

内存泄漏:new 未 delete,函数提前返回、异常导致释放代码不执行

野指针:内存释放后指针未置空,非法访问程序崩溃

重复释放:同一块内存多次 delete,程序宕机

解决方案 :智能指针,依托 RAII 机制实现内存自动管理

二、核心基础:RAII 机制

全称:资源获取即初始化,是 C++ 核心资源管理思想

核心逻辑:

对象初始化阶段:获取/托管内存资源

对象生命周期结束:析构函数自动释放资源

核心价值:

彻底规避手动释放资源的疏漏问题

三、智能指针整体原理

3.1 本质

标准库模板类,对裸指针进行封装,重载 *、->,兼容裸指针使用方式

3.2 核心工作机制

构造函数:绑定、托管裸指针内存

析构函数:自动释放托管内存

运算符重载:支持指针解引用、成员访问

3.3 三大核心类型(头文件:<memory>)

unique_ptr:独占式智能指针

shared_ptr:共享式智能指针(引用计数)

weak_ptr:弱引用智能指针(辅助纠错)

四、三类智能指针详细知识点

4.1 unique_ptr 独占智能指针(基础首选)

核心特性

独占所有权:同一内存仅可被一个 unique_ptr 托管

禁止拷贝、赋值,仅支持 std::move 移动所有权

零运行开销,效率等同于裸指针

常用用法

初始化:优先 make_unique(C++14)

核心方法:get()(获取裸指针)、reset()(重置托管内存)、release()(解除托管)

适用场景:局部动态内存、独占式资源管理、容器存储独占对象

易错点:禁止多指针托管同一块内存、禁止裸指针二次托管

4.2 shared_ptr 共享智能指针

核心特性

共享所有权:多指针可托管同一块内存

引用计数机制:独立空间记录指针数量,计数为 0 自动释放内存

支持拷贝、赋值,每次拷贝计数+1,指针析构计数-1

常用用法

初始化:优先 make_shared(效率更高、更安全)

核心方法:use_count()(查看引用计数)

适用场景:多对象共享资源、全局资源、复杂对象依赖场景

核心缺陷:存在循环引用问题,会导致内存泄漏

4.3 weak_ptr 弱引用智能指针(辅助工具)

核心特性

无内存所有权,不参与 shared_ptr 引用计数

仅做内存观察,不影响内存生命周期

常用用法

由 shared_ptr 构造生成

expired():判断托管内存是否已释放

lock():安全转换为 shared_ptr,访问资源

核心作用:解决 shared_ptr 循环引用导致的内存泄漏问题

五、三大智能指针对比总结(必背)

指针类型 所有权 引用计数 拷贝/移动 核心场景
unique_ptr 独占 无 禁拷贝、可移动 独占资源、常规局部内存管理
shared_ptr 共享 有 可拷贝、可移动 多对象共享资源
weak_ptr 无 不参与计数 可拷贝、可移动 解决循环引用、安全观察内存

六、高频考点 & 开发规范

优先使用 make_unique/make_shared 初始化,杜绝裸指针直接托管

开发优先用 unique_ptr,非必要不使用 shared_ptr(有计数开销)

weak_ptr 不可直接解引用,必须通过 lock() 转换后访问资源

禁止裸指针与智能指针混用管理同一块内存

循环引用场景:双向依赖中一方用 shared_ptr,一方用 weak_ptr

七、总结

智能指针核心:RAII 自动内存管理,解决裸指针泄漏、野指针、重复释放问题

分工逻辑:unique 管独占、shared 管共享、weak 管纠错

编码原则:能独占不共享,共享防泄漏用 weak_ptr

相关推荐
ShineWinsu5 小时前
对于Redis:Hash类型的解析
c++·redis·分布式·缓存·面试·hash·哈希表
wuminyu5 小时前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
可乐鸡翅yeah_5 小时前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
流形填表5 小时前
多校区题库标准化:Excel模板与校验脚本
开发语言·python
All for pursuit.5 小时前
【贪心-4】581.最短无序连续子数组
数据结构·c++·算法·leetcode
步行cgn6 小时前
AOP 通知的类型详解
开发语言
weixin_307779136 小时前
从“人操作仪器”到“Agent 自主发现”:OPL 金属材料自驱动实验室 MVP 技术论述
开发语言·人工智能·算法·架构
无名猿6 小时前
list 与 forward_list:链表真的比 vector 快吗
c++·性能优化·stl·内存管理·标准库
笑鸿的学习笔记6 小时前
C++笔记之SIMD与SSE指令集
开发语言·c++·笔记
汉克老师6 小时前
GESP2026年9月认证C++一级( 第二部分判断题(1~10题)精讲
c++·gesp·小学生·学c++编程