0Pricing
C++ Academy · 课时

RAII 原则

将资源与对象生命周期绑定

RAII 原则 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

RAII 的含义

RAII 代表资源获取即初始化。资源在构造函数中获取,在析构函数中释放,从而将资源的生命周期与对象绑定。

核心理念

将每种资源——内存、文件、锁和套接字——都封装在对象中。当对象离开作用域时,其析构函数会自动释放资源。

#include <iostream>

class Resource {
public:
    Resource() { std::cout << "acquire\n"; }
    ~Resource() { std::cout << "release\n"; }
};

int main() {
    Resource r;   // acquired
}                 // released automatically

RAII 为什么强大

即使函数提前返回或抛出异常,清理也能得到保证。对于已经封装的资源,您不会忘记释放它。

一个小型 RAII 封装器

下面是一个负责释放堆内存的 int 所有者,其析构函数会完成释放——调用处无需手动使用 delete。

#include <iostream>

class IntBox {
    int* p;
public:
    IntBox(int v) : p(new int(v)) {}
    ~IntBox() { delete p; }
    int get() const { return *p; }
};

int main() {
    IntBox b(42);
    std::cout << b.get() << "\n";
}

提前返回时清理

由于析构函数会在退出作用域时运行,即使提前执行 return,也仍然会触发清理。

#include <iostream>

class Guard {
public:
    ~Guard() { std::cout << "cleaned\n"; }
};

void work(bool stop) {
    Guard g;
    if (stop) return;   // g still cleaned
    std::cout << "more work\n";
}

int main() { work(true); }

发生异常时清理

如果异常导致栈展开,沿途每个已经完整构造的 RAII 对象都会被销毁。资源绝不会无人处理。

标准 RAII 类型

标准库中充满了 RAII 类型:std::unique_ptr、std::lock_guard、std::fstream 和 std::vector 都会在析构函数中完成清理。

#include <vector>
#include <memory>

int main() {
    std::vector<int> v{1, 2, 3};        // frees its buffer
    auto p = std::make_unique<int>(9);  // frees its int
}

无需手动编写清理代码

使用 RAII 后,您不再需要手动编写 delete、fclose 或 unlock。编译器插入的析构函数调用会替您完成这些工作。

每个资源一个所有者

每个资源都应有一个负责释放它的 RAII 所有者。要安全地共享所有权,需要使用 std::shared_ptr 等专用类型。

RAII 可以组合

一个 RAII 对象可以包含其他 RAII 对象。销毁会自动级联,因此复杂资源也能得到正确清理。

#include <memory>
#include <vector>

struct Session {
    std::vector<int> data;                 // RAII
    std::unique_ptr<int> token;            // RAII
};   // both members freed automatically

RAII 与手动管理

手动管理容易出错;RAII 则将正确清理设为默认行为。在任何情况下,都应优先使用 RAII 封装器,而不是裸的获取与释放配对操作。

快速检查

测试您对 RAII 的理解。

回顾

您已经学习了 RAII 原则:在构造函数中获取资源,在析构函数中释放资源。这可以保证在正常退出、提前返回和发生异常时都完成清理。标准库处处使用 RAII,您的代码也应如此。

常见问题解答

「RAII 原则」课时是免费的吗?

是的 — 「RAII 原则」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「RAII 原则」这节课中我会学到什么?

将资源与对象生命周期绑定 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「RAII 原则」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. RAII 原则
  2. 析构函数与清理
  3. 三法则与五法则
  4. 作用域守卫
← 返回 C++ Academy