RAII
No related notes
Outlinks (0)
No outlinks found
Backlinks (0)
No backlinks found
RAII#
S 程序需要管理资源(内存、文件句柄、锁、网络连接等),用完必须释放 C 手动释放容易遗漏——尤其有多个 return 路径或抛异常时,资源泄漏防不胜防 Q 如何保证资源一定被释放,且代码简洁、异常安全? A 把资源的生命周期绑定到对象的生命周期——构造函数获取资源,析构函数释放资源。对象离开作用域时自动析构,资源必然释放
RAII (Resource Acquisition Is Initialization),资源获取即初始化,由 Bjarne Stroustrup 在 1984-1989 年间为 C++ 异常安全的资源管理而提出。
核心规则:
- 资源获取发生在构造函数中(获取失败则构造失败)
- 资源释放发生在析构函数中
- 持有资源是类不变量,与对象生命周期绑定
- 没有对象泄漏 → 没有资源泄漏
1.1 · 优势
- 封装:资源管理逻辑定义一次,不散落在每个调用点
- 异常安全:栈上资源在异常传播时自动释放
- 局部性:获取和释放逻辑在类定义中紧邻
1.2 · 各语言的近似实现
| 语言 | 机制 | 是否自动 |
|---|---|---|
| C++ | 析构函数 ~X()、智能指针 unique_ptr/shared_ptr | ✅ |
| Rust | Drop trait + 所有权系统,天然 RAII | ✅ |
| Go | defer(弱化版,手动声明但保证执行) | 半自动 |
| Zig | defer/errdefer(errdefer 仅在错误返回时执行) | 半自动 |
| Python | with + 上下文管理器 (__enter__/__exit__) | 半自动 |
1.3 · 局限
- 仅对栈分配的对象有效(有明确的静态生命周期)
- 堆分配对象需配合智能指针才能实现 RAII
- 循环引用需要弱引用(
weak_ptr)打破