深入理解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;
}
相关推荐
芒鸽1 小时前
把 Agent 运行时做成插件系统:agent-harness(openJiuwen Rust版) 的实践
开发语言·后端·rust
Brilliantwxx1 小时前
【STM32】 I2C 外设内部硬件结构和状态位
开发语言·stm32·单片机·嵌入式硬件
小七在进步1 小时前
类和对象(二)
java·开发语言
CHHH_HHH1 小时前
【Linux系统篇】进程间通信揭秘:从管道到共享内存
linux·服务器·c语言·开发语言·后端·ubuntu
写后端的胖头鱼1 小时前
【高频面试题】面试题里常出现的Bitmap是什么(附源码和多种场景)
java·开发语言·面试·位图·bitmap
学习智者1 小时前
《玄》IDE v3.8.2重磅发布:数据外置+全链路优化
开发语言·c++·ide·中文语言 玄
2601_9669496510 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin10 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
anew___10 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c