深入理解C++ 析构函数<四>虚析构函数

虚析构函数是什么?

虚析构函数 就是在基类中声明为 virtual 的析构函数:

cpp

复制代码
class Base {
public:
    virtual ~Base() = default;
};

它的核心作用是:

当通过基类指针 删除一个派生类对象时,能够正确调用派生类的析构函数,然后再调用基类的析构函数。

如果基类析构函数不是虚函数,那么:

cpp

复制代码
Base* p = new Derived;
delete p;

这是未定义行为 。很多情况下只会调用 Base::~Base(),而不会调用 Derived::~Derived(),导致派生类资源泄漏。

cpp 复制代码
#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base 构造\n";
    }

    virtual ~Base() {
        std::cout << "Base 析构\n";
    }
};

class Derived : public Base {
public:
    Derived() {
        data = new int[10];
        std::cout << "Derived 构造,申请资源\n";
    }

    ~Derived() override {
        delete[] data;
        std::cout << "Derived 析构,释放资源\n";
    }

private:
    int* data = nullptr;
};

int main() {
    std::cout << "创建 Derived 对象,用 Base* 保存\n";

    Base* p = new Derived;

    std::cout << "通过 Base* 删除对象\n";
    delete p;

    std::cout << "程序结束\n";
    return 0;
}
相关推荐
大侠归来43 分钟前
C 语言 | 在函数中操作数组
c语言·c++·算法
liangshanbo12151 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
朝朝辞暮i7 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
小师兄吃牛肉8 小时前
C语言篇:宏
c语言·开发语言
郑同学的笔记8 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
随意起个昵称8 小时前
【背包dp】输出方案路径
c++·动态规划
言乐69 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_307779139 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
kakakahahahaha9 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i9 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法