RAII(Resource Acquisition Is Initialization)是 C++ 最重要的编程习惯之一。它的核心思想是:将资源的生命周期绑定到对象的生命周期,利用 C++ 确定性的析构函数实现自动、安全的资源释放。
RAII 的三原则
- 在构造函数中获取资源(或使用已获取的资源初始化对象)。
- 在析构函数中释放资源。
- 保证对象在异常发生时也能被正确销毁(栈展开机制)。
不仅仅是内存
RAII 适用于各种资源:文件句柄、socket 连接、互斥锁、数据库连接、甚至是一个状态的进入与退出。
class ScopedTimer {
std::chrono::steady_clock::time_point start;
const char* name;
public:
ScopedTimer(const char* n) : name(n), start(clock::now()) {}
~ScopedTimer() {
auto elapsed = clock::now() - start;
log("%s took %lld ms", name, elapsed.count());
}
};
异常安全保证
RAII 与异常安全密不可分。基本保证(无资源泄漏)、强保证(失败时回滚到原状态)和不抛出保证(noexcept),都需要依靠 RAII 来实现。
现代替代:Scope Guard
C++ 标准库提供了 scope_exit 等工具,可以在不创建专门类型的情况下实现 RAII 效果。
RAII 是 C++ 给世界的礼物——用编译器保证的确定性析构,替代了人脑无法保证的手动资源管理。