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++ 给世界的礼物——用编译器保证的确定性析构,替代了人脑无法保证的手动资源管理。