Z
ZHANK
指针与内存

RAII 资源管理

资源获取即初始化、析构函数自动释放、锁守卫 lock_guard

RAII 资源管理

RAII(Resource Acquisition Is Initialization) 是 C++ 最重要的设计哲学——用对象的生命周期自动管理资源。

学完本章你将: 理解 RAII 思想、析构函数保证释放、lock_guard 实战。


什么是 RAII

cpp
#include <iostream>
#include <fstream>

// RAII 包装文件操作
class File {
    FILE *fp;
public:
    File(const char *path, const char *mode) {
        fp = fopen(path, mode);  // 构造时获取资源
    }
    ~File() {
        if (fp) fclose(fp);      // 析构时释放资源
        std::cout << "文件已关闭\n";
    }
    void write(const char *s) { fprintf(fp, "%s", s); }
};

int main() {
    {
        File f("test.txt", "w");
        f.write("Hello RAII\n");
    }  // f 离开作用域,析构函数自动调用 → 文件自动关闭!
    // 不用写 fclose,不会忘记
    return 0;
}

标准库中的 RAII

cpp
// 互斥锁自动释放
std::mutex mtx;
{
    std::lock_guard<std::mutex> lock(mtx);  // 构造时加锁
    // ... 临界区 ...
}  // 析构时自动解锁——永远不会忘

// unique_ptr 自动释放内存
{
    auto p = std::make_unique<int>(42);
}  // 自动 delete

// ifstream 自动关闭文件
{
    std::ifstream f("data.txt");
    // ... 读文件 ...
}  // 自动关闭

💡 RAII 的核心: 资源获取就是初始化,资源释放就是析构。C++ 的析构函数保证即使抛出异常也会执行——资源永远不会泄漏。