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

相关推荐
yuzhiboyouye15 分钟前
com.fasterxml.jackson.annotation 里最常用高频的注解,可以按“控制字段、控制格式、控制结构、控制流程”来记
java·开发语言
HAPPY酷17 分钟前
C++ 内存泄漏排查:从裸 new 到 RAII 修复,附 ASan 实战
开发语言·c++
十年Java程序媛40 分钟前
Java 面试常问 this、super:构造方法调用顺序避坑
java·开发语言·spring boot·面试·个人开发
学到老活到老1 小时前
类已经加载了,为什么静态代码还没执行?
java·jvm
学到老活到老1 小时前
写了 new,就一定会在堆上分配对象吗?
java·jvm
yuniko-n1 小时前
【JUC】内存屏障
java·开发语言
Linux运维技术栈1 小时前
近期 PHP 高危安全风险排查与多环境升级实操
开发语言·安全·php
凯瑟琳.奥古斯特1 小时前
力扣1015C++解法技巧
c++·算法·leetcode·链表·职场和发展
Fnetlink11 小时前
Fnet 云网安 261023
运维·开发语言·网络·人工智能·安全·web安全·php
悠仁さん2 小时前
【算法C++】双指针(一)
数据结构·c++·算法