Skip to main content

RAII

📅 2026-03-30 ✏️ 2026-03-30 CS
No related notes

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
RustDrop trait + 所有权系统,天然 RAII
Godefer(弱化版,手动声明但保证执行)半自动
Zigdefer/errdefererrdefer 仅在错误返回时执行)半自动
Pythonwith + 上下文管理器 (__enter__/__exit__)半自动

1.3 · 局限

  • 仅对栈分配的对象有效(有明确的静态生命周期)
  • 堆分配对象需配合智能指针才能实现 RAII
  • 循环引用需要弱引用(weak_ptr)打破