RAII 是一种把资源的生命周期绑定到对象生命周期上的编程惯用法。资源在对象构造时获取、在对象析构时自动释放,借助栈对象的确定性析构,保证即使发生异常也不会泄漏资源。它是 C++ 资源管理的基石。

| 中文名 | 资源获取即初始化 |
| 外文名 | RAII |
| 提出者 | Bjarne Stroustrup |
| 主要语言 | C++、Rust |
| 核心机制 | 确定性析构 |
| 解决问题 | 资源泄漏、异常安全 |
资源获取即初始化(Resource Acquisition Is Initialization,RAII)是一种将资源的持有与一个对象的生命周期严格绑定的编程惯用法:在对象构造时获取资源,在对象销毁时释放资源,从而把资源管理交给编译器保证的对象析构机制。
RAII 由 C++ 之父 Bjarne Stroustrup 提出并命名,是 C++ 异常安全和资源管理的核心思想。其关键在于利用具有确定性析构的栈对象:当控制流离开作用域时,无论是正常返回还是抛出异常,局部对象的析构函数都必然被调用,资源随之自动释放。程序员因此不必手动编写与每条退出路径对应的清理代码,大幅降低了资源泄漏的风险。
标准库中的智能指针如 unique_ptr、shared_ptr 用 RAII 管理堆内存;lock_guard、unique_lock 用 RAII 管理互斥锁的加锁与解锁;fstream 用 RAII 管理文件句柄。除 C++ 外,Rust 的所有权与 Drop 特质、以及带有确定性析构或 using/with 结构的语言也体现了同类思想,广泛用于文件、网络连接、数据库事务等需要成对获取与释放的资源。
问:垃圾回收语言需要 RAII 吗?答:GC 只自动回收内存,且回收时机不确定,对文件、锁等非内存资源仍需及时释放,因此这类语言常用 try-with-resources、using、defer 等结构来补充确定性清理。
问:RAII 会带来性能开销吗?答:构造与析构本身开销很小,且多在编译期内联;它换来的是安全与简洁,通常远优于手动管理带来的隐患。

| 中文名 | 资源获取即初始化 |
| 外文名 | RAII |
| 提出者 | Bjarne Stroustrup |
| 主要语言 | C++、Rust |
| 核心机制 | 确定性析构 |
| 解决问题 | 资源泄漏、异常安全 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧