


资源介绍
运用已验证的内存管理技术编写更精简、更安全的 C++代码
本书围绕 C++ 内存管理展开,从基础概念到高级技术,系统讲解了内存管理的核心原理与实践方法。全书分为 4 个部分,共 15 章,涵盖对象模型、内存操作陷阱、智能指针、内存分配运算符重载、内存泄漏检测等内容。
主要章节内容
第一部分:C++ 中的内存
对象、指针与引用
内存表示:C++ 内存由一个或多个连续字节序列组成,每个字节有唯一地址
核心概念:
对象:占据存储空间、有生命周期的实体(包括基本类型)
指针:带类型的地址,支持算术运算但存在风险
引用:对象的别名,无独立存储,必须绑定到对象
对象属性:生命周期、大小、对齐方式、填充字节、复制与移动语义
数组:连续存储的同类型元素序列,支持指针算术
注意事项
危险操作分类:
未定义行为(UB):如解引用空指针、数组越界访问
实现定义行为:如 int 的大小、char 的符号性
未指定行为:如子表达式求值顺序
指针操作:合法的指针算术范围、指针互转换性、类型双关(type punning)
特殊工具:std::memcpy()、char*/std::byte*的特殊地位、std::start_lifetime_as()
类型转换与 cv 限定符
cv 限定符:const(不可变)和volatile(易变)的语义与应用
C++ 类型转换:
static_cast:安全的类型转换(如基类与派生类转换)
dynamic_cast:运行时类型检查(需多态类型)
const_cast:添加 / 移除 cv 限定符
reinterpret_cast:底层类型转换(高风险)
bit_cast:字节级转换(C++20)
duration_cast:时间单位转换
C 风格转换:不推荐,语义模糊且风险高
第二部分:隐式内存管理技术
使用析构函数
析构函数作用:对象生命周期结束时自动执行清理操作
RAII(资源获取即初始化):将资源管理绑定到对象生命周期
最佳实践:
析构函数不应抛出异常
明确对象销毁顺序
利用标准库工具(unique_ptr、lock_guard、容器等)
标准智能指针
std::unique_ptr:
独占所有权,不可复制但可移动
支持自定义删除器、数组特化
推荐使用std::make_unique创建
std::shared_ptr:
共享所有权,通过引用计数管理生命周期
配合std::weak_ptr解决循环引用
推荐使用std::make_shared优化内存
原始指针用途:非所有权的观察角色
自定义智能指针
实现原理:
unique_ptr:管理指针和删除器,禁用复制
shared_ptr:管理指针、引用计数和删除器
特殊智能指针:
non_null_ptr:确保指针非空
observer_ptr:明确非所有权的观察语义
基于策略的复制指针(如自动复制指向对象)
第三部分:内存管理机制控制
重载内存分配运算符
全局运算符:operator new/operator delete及其数组版本
非抛出版本:operator new(nothrow)系列
placement new:在指定内存位置构造对象,不分配内存
成员版本:为特定类定制分配逻辑
对齐感知版本:处理过度对齐类型(C++17+)
销毁删除器(destroying delete):C++20 特性,结合销毁与释放
编写简易内存泄漏检测器
原理:重载全局new/delete跟踪内存分配与释放
实现:
单例类记录分配信息(地址、大小)
分配时记录,释放时移除
程序结束时检查未释放的内存
非典型分配机制
内存映射硬件:使用 placement new 映射对象到硬件寄存器
非抛出new的简化使用:封装错误检查
new_handler:内存分配失败时的回调机制
特殊内存(共享内存、持久内存):通过自定义分配器接入
基于内存池的管理与优化
内存池(arena):预先分配大块内存,内部管理小块分配
优化场景:
按大小分类的内存池
场景化内存管理(如游戏关卡内存)
减少内存碎片,提高分配效率
延迟回收
延迟回收:将对象销毁推迟到特定时刻(如程序结束、作用域结束)
实现方式:
仅回收不析构(适用于 trivially destructible 类型)
回收并析构(需记录对象类型)
作用域级回收(结合引用计数跟踪使用状态)
第四部分:编写通用容器
显式内存管理的通用容器
容器实现:自定义Vector和ForwardList
关键考量:异常安全性、复杂度权衡、内存效率
隐式内存管理的通用容器
利用智能指针简化容器内存管理
设计权衡:安全性提升 vs 性能开销
支持分配器的通用容器
分配器作用:抽象内存分配策略
传统分配器与 polymorphic memory resource(PMR)
嵌套分配器、分配器与数据收集
当代议题
无构造函数启动对象生命周期
平凡重定位(trivial relocation)
类型感知的分配 / 释放函数
C++26/C++29 潜在新特性