c++为什么基类的析构函数必须是虚函数 防止内存泄漏【OOP必知】

admin 百科 16
基类析构函数必须是虚函数,以确保通过基类指针删除派生类对象时能正确调用派生类析构函数;否则仅调用基类析构函数,导致资源未释放、内存泄漏或程序异常。

c++为什么基类的析构函数必须是虚函数 防止内存泄漏【OOP必知】-第1张图片-佛山资讯网

基类的析构函数必须是虚函数,**不是为了防止内存泄漏本身,而是为了确保通过基类指针删除派生类对象时,能正确调用派生类的析构函数**。如果没做到这点,会导致资源未释放(比如动态分配的内存、文件句柄、网络连接等),进而引发内存泄漏或程序异常。

虚析构函数解决的是“析构行为不完整”问题

当用 基类指针指向派生类对象,并用 delete 删除该指针时:

  • 若基类析构函数非虚 → 只调用基类析构函数,派生类析构函数被跳过;
  • 若基类析构函数是虚函数 → 根据实际对象类型,触发完整的析构链(派生类→基类),保证所有清理逻辑执行。

例如:

class Base {
public:
    ~Base() { cout << "Base dtor\n"; } // 非虚 → 危险!
};
class Derived : public Base {
    int* p = new int[100];
public:
    ~Derived() { delete[] p; cout << "Derived dtor\n"; }
};
<p>Base* ptr = new Derived();
delete ptr; // 输出只有 "Base dtor" → p 泄漏!</p>

登录后复制

哪些情况必须声明虚析构函数?

只要满足以下任一条件,基类析构函数就应声明为 virtual

立即学习“C++免费学习笔记(深入)”;

标签: c++ 为什么

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~