前置基础:裸指针、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