0Pricing
C++ Academy · 课时

析构函数与清理

自动释放资源

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

析构函数的作用

当对象的生命周期结束时,析构函数会运行。它负责释放对象所拥有的一切资源。它的名称是 ~ClassName。

#include <iostream>

class File {
public:
    ~File() { std::cout << "closing file\n"; }
};

int main() {
    File f;
}   // ~File runs here

释放所拥有的内存

如果类拥有堆内存,其析构函数就必须释放这部分内存。这是调用 delete 的经典位置。

#include <iostream>

class Buffer {
    int* data;
public:
    Buffer(int n) : data(new int[n]) {}
    ~Buffer() { delete[] data; }   // cleanup
};

int main() { Buffer b(10); }

析构函数会自动运行

对于栈对象,您不需要自行调用析构函数——编译器会在作用域结束时插入调用。

成员的逆序销毁

成员对象会在析构函数体执行之后,按照声明顺序的逆序销毁。

#include <iostream>

struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
    A a;
    B b;          // destroyed before a
    ~C() { std::cout << "~C\n"; }
};

int main() { C c; }

虚析构函数

如果通过 Base 指针对 Derived 对象执行 delete,Base 的析构函数必须是virtual——否则 Derived 部分会泄漏。

#include <iostream>

struct Base {
    virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
    ~Derived() override { std::cout << "~Derived\n"; }
};

int main() {
    Base* p = new Derived();
    delete p;   // both run thanks to virtual
}

析构函数不应抛出异常

在栈展开期间从析构函数中抛出异常会终止程序。析构函数应(隐式地)标记为 noexcept,绝不能让异常逃逸。

默认析构函数

如果您没有编写析构函数,编译器会生成一个销毁每个成员的析构函数。对于只包含 RAII 成员的类,这正是正确的做法。

#include <string>
#include <vector>

struct Record {
    std::string name;          // self-cleaning
    std::vector<int> values;   // self-cleaning
};   // default destructor is enough

显式使用默认实现的析构函数

编写 ~Class() = default; 可以显式请求编译器生成析构函数——当您需要虚析构函数但不需要自定义逻辑时,这很有用。

#include <iostream>

struct Shape {
    virtual ~Shape() = default;   // virtual + default
};

释放非内存资源

析构函数还会关闭文件、释放锁以及断开套接字连接——它们不只是用于释放内存。任何已获取的资源都应在这里释放。

对象之间的顺序

多个局部对象会按照构造顺序的逆序销毁,因此析构函数可以安全地使用在它之前创建的对象。

让 RAII 成员完成工作

如果每个成员都是 RAII 类型,通常完全不需要自定义析构函数。请将手写析构函数留给裸资源。

快速检查

测试您对析构函数的理解。

回顾

您已经了解到,析构函数会在生命周期结束时自动释放所拥有的资源,按照成员声明顺序的逆序运行,并且不得抛出异常;在多态 Base 类中还必须是 virtual。使用 RAII 成员通常可以避免编写自定义析构函数。

常见问题解答

「析构函数与清理」课时是免费的吗?

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

「析构函数与清理」这节课中我会学到什么?

自动释放资源 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

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

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

「析构函数与清理」课时需要多长时间?

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

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

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

此课程中的所有课时

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