内存管理

6 篇文章

查看专题概览 / 复习建议

核心问题

  • 栈和堆的分配与释放责任分别是什么
  • RAII 为什么是 C++ 资源管理核心
  • 智能指针各自适用什么场景
  • 循环引用为什么会导致资源不释放
  • 内存对齐和缓存友好的数据结构
  • 对象生命周期与资源管理的关系
  • 异常安全在资源管理中的重要性
  • 自定义删除器和分配器的使用

建议复习顺序

  1. 栈与堆(内存分配基础)
  2. RAII 与异常安全(资源管理核心)
  3. 智能指针(现代内存管理)
  4. new/delete 与对象构造析构
  5. 内存对齐和对象生命周期
  6. 异常安全保证(进阶话题)

子主题导航

高频追问

  • shared_ptr 的控制块里通常有什么
  • unique_ptr 为什么不能拷贝
  • 析构函数为什么要倾向 noexcept
  • 对象生命周期和内存生命周期有什么区别
  • new 做了哪些事,为什么 malloc 不能替代它
  • placement new 的典型使用场景是什么
  • 对齐为什么会影响性能和布局
  • 为什么C++不采用垃圾回收
  • 智能指针的性能开销分析
  • 如何设计异常安全的资源管理类

易错点

  • 把在栈上和作用域结束自动释放完全划等号
  • weak_ptr 理解成弱版 shared_ptr
  • 只会背智能指针定义,不会讲适用场景
  • 混淆“分配内存”和“构造对象”两个步骤
  • 忽略RAII的广泛适用性(不只是内存)
  • 在资源管理类中忘记实现移动语义
  • 不理解控制块和引用计数的实现

学习策略

记忆技巧

内存管理四层次

  • 栈 = “自动管理,快而小”
  • 堆 = “手动管理,慢而大”
  • RAII = “构造获取,析构释放”
  • 智能指针 = “现代C++内存管理”

智能指针选择口诀

  • 独占用unique_ptr
  • 共享用shared_ptr
  • 观察用weak_ptr
  • 原始指针仅作参数

关联学习

内存管理与前面的知识紧密相关:

  1. 语言基础:栈/堆分配、生命周期
  2. 模板与泛型:智能指针的模板实现
  3. 移动语义:unique_ptr的移动、资源转移
  4. const正确性:资源的const访问控制

理解内存管理需要结合具体场景,掌握各种机制的适用边界。