虚析构函数确保通过基类指针删除派生类对象时能正确调用派生类析构函数,避免资源泄漏;只要类可能被继承且存在多态删除场景,就必须声明为virtual,推荐写法为virtual ~Base() = default;。

虚析构函数的核心作用不是直接“防止内存泄漏”,而是确保通过基类指针删除派生类对象时,能正确调用派生类的析构函数。如果没声明为虚函数,只会调用基类析构函数,导致派生类中申请的资源(如动态内存、文件句柄等)无法释放——这才是引发内存泄漏等资源泄漏的根本原因。
当用 基类指针指向派生类对象,并用 delete 删除时,C++ 默认按指针静态类型(即基类)决定调用哪个析构函数。若基类析构函数非虚,编译器不会进行动态绑定,派生类析构函数根本不会执行。
int* p = new int[100];)未被清理 → 内存泄漏只要类设计为“可能作为基类被继承”,且**存在多态删除场景**(即通过基类指针/引用管理派生类对象生命周期),就必须将析构函数声明为 virtual。
Shape, Logger)Base* p = new Derived; + delete p;,就该加 virtual
final),或从不通过基类指针删除对象,则无需虚析构通常在基类中声明为 virtual,可以是纯虚(= 0)或带空实现;派生类析构函数会自动成为虚函数,无需显式加 virtual 关键字。
立即学习“C++免费学习笔记(深入)”;
virtual ~Base() = default;(C++11起,简洁安全)virtual ~Base() { }(显式空实现)下面代码看似正常,但会漏掉派生类资源清理:
class Base {
public:
~Base() { cout << "Base dtor\n"; } // ❌ 非虚 → 危险!
};
class Derived : public Base {
int* data;
public:
Derived() : data(new int[1000]) {}
~Derived() { delete[] data; cout << "Derived dtor\n"; }
};
// ...
Base* p = new Derived;
delete p; // 输出只有 "Base dtor" → data 泄漏!
改成 virtual ~Base() = default; 后,输出变为 "Derived dtor" → "Base dtor",资源正确释放。
以上就是C++中的虚析构函数有什么作用?(防止内存泄漏)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号