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

相关推荐
落魄大学生之流水线上谋生计1 小时前
JVM内存结构、垃圾回收算法与类加载机制详解
jvm·算法
清水白石0081 小时前
别被 `Process.start()` 骗了:Python multiprocessing 从面试题到线上生产的进程启动机制实战
开发语言·python
geovindu1 小时前
java: Task Scheduler
java·开发语言·后端
神奇小梵1 小时前
java的特殊语法点,与常规语言相异的点
java·开发语言
bnmoel2 小时前
C++ 基础入门篇(二):引用
开发语言·c++·引用·底层
richard_yuu2 小时前
AOI 实战第六篇:.onnx 到 C++ 的最后一公里
c++·深度学习·yolo
wuminyu2 小时前
Kafka配置TLS/SSL加密传输时零拷贝失效分析
java·linux·c语言·jvm·c++
影视飓风TIM2 小时前
C++ 智能指针:auto_ptr / unique_ptr / shared_ptr / weak_ptr 原理与使用
开发语言·c++
一木 之林2 小时前
李沐《动手学深度学习》知识卡合集:从 Softmax 回归到房价实战(第24-50集)
开发语言·c++·人工智能