深入理解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;
}
相关推荐
SomeOtherTime9 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain10 小时前
C++转Java日记(10)
java·开发语言
总要学点什么10 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
YLCHUP10 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck11 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀11 小时前
背包DP(01背包+完全背包)
c++·算法
Funlang12 小时前
龙芯上的 Fun:从跑起来到机器码
开发语言·龙芯
总要学点什么12 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
旖旎夜光12 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu13 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页