析构函数与清理
自动释放资源
析构函数与清理 是 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 反馈 — 无需本地设置。