Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

C++ 内存管理

内存管理是 C++ 编程中的核心概念之一,它直接影响程序的性能、可靠性和稳定性。C++ 提供了灵活且高效的内存管理机制,这也使得开发者能够更精细地控制程序的内存使用。C++ 中的内存管理分为两大类:静态内存管理和动态内存管理。

在 C++ 中,静态内存管理主要涉及由编译器管理的栈内存,通常用于存储局部变量和函数调用的相关信息。与此不同,动态内存管理则涉及到程序运行时动态分配的内存区域,这通常需要程序员显式地分配和释放内存。

C++ 提供了一些工具来帮助开发者更高效地管理内存,避免内存泄漏、悬空指针和野指针等常见问题。在传统的内存管理方式中,开发者需要通过 new 和 delete 来手动管理动态内存的分配和释放。而为了提高开发效率和安全性,C++11 引入了智能指针,如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr,它们自动管理内存的生命周期,减少了人为错误的可能性。

此外,C++ 还提供了内存池和内存对齐等更底层的内存管理技术,使得开发者可以根据需要进一步优化程序的内存使用。

本章内容

章节说明
内存布局与模型栈、堆、全局区、常量区与代码段的划分,对象在内存中的排布
动态内存分配new / delete 的机制、operator new 与 placement new、数组与对齐
RAII 与资源管理用对象生命周期管理资源的核心思想,以及它的各种应用形态
智能指针unique_ptr、shared_ptr、weak_ptr 的用法与取舍
自定义内存管理分配器、内存池、pmr 与对象池
内存调试与诊断常见内存错误的成因与检测工具
C++ 内存模型(并发)原子操作、内存序与 happens-before 关系

几条经验

在展开细节之前,先把结论摆在这里。后面各章基本都是在解释这几条为什么成立:

  • 能用栈就别用堆。栈上分配几乎零成本,而且天然异常安全。只有当对象需要活过当前作用域、或者体积过大时,才考虑堆。
  • 不要手写 delete。用 RAII 把资源交给对象管理,让析构函数去释放。手动 delete 的代码在异常路径上几乎必然出错。
  • 所有权要明确。一个资源归谁管、什么时候释放,应该在类型上就能看出来。unique_ptr 表示独占,shared_ptr 表示共享,裸指针只表示「我不负责释放」。
  • 先想清楚生命周期,再想性能。绝大多数内存 bug 都源于生命周期没理顺,而不是分配次数太多。