C++ 内存管理的三大时代
| 时代 | 代表写法 | 内存安全程度 | 现代项目是否推荐 | 备注 |
|---|---|---|---|---|
| C 风格时代 | new / delete / malloc / free | ★☆☆☆☆ | 几乎不推荐 | 极易泄漏、双 delete、悬垂指针 |
| 半现代时代 | auto_ptr + 手动 new/delete | ★★☆☆☆ | 已过时 | C++98/03 时代的过渡产物 |
| 现代 C++ | RAII + 智能指针 + 容器 | ★★★★★ | 强烈推荐 | C++11 之后的主流写法 |
现代 C++ 内存管理的核心理念
- 谁分配谁负责释放(所有权清晰)
- 资源获取即初始化(RAII) —— 构造时获取,析构时释放
- 尽量避免显式 delete(让编译器/标准库帮你管)
- 默认使用栈 > 智能指针 > 裸指针(从安全到危险排序)
现代 C++ 中最常用的 7 种内存管理方式
| 优先级 | 方式 | 所有权语义 | 典型场景 | 是否推荐 new/delete |
|---|---|---|---|---|
| 1 | 局部变量(栈上) | 作用域结束自动销毁 | 99% 的小对象、临时变量 | 绝对不写 new |
| 2 | std::unique_ptr<T> | 独占所有权 | 需要动态生命周期,但只有一个拥有者 | 推荐 make_unique |
| 3 | std::shared_ptr<T> | 共享所有权(引用计数) | 需要多处共享、延迟销毁的场景 | 推荐 make_shared |
| 4 | std::vector<T> / std::string 等容器 | 容器负责 | 动态大小的序列、字符串 | 基本不用 new[] |
| 5 | std::weak_ptr<T> | 非拥有(弱引用) | 解决 shared_ptr 循环引用 | — |
| 6 | 自定义 RAII 封装类 | 资源(文件/锁/句柄) | 数据库连接、文件、互斥锁、socket 等 | — |
| 7 | 裸指针(作为观察者) | 无所有权 | 函数参数、回调、遍历(不负责释放) | 可以用,但慎用 |

