Virtual析构函数

Virtual析构函数

virtual析构函数确保在通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,从而防止资源泄露

virtual析构函数的问题

当基类的析构函数不是 virtual时,通过基类指针delete对象,只会调用基类的析构函数,派生类的析构函数会被完全忽略

c++ 复制代码
#include <iostream>

class Base {
public:
    Base() { std::cout << "Base constructor\n"; }
    // 非虚析构函数
    ~Base() { std::cout << "Base destructor\n"; }
};

class Derived : public Base {
private:
    int* data_;
public:
    Derived() { 
        data_ = new int[100]; // 派生类申请了资源
        std::cout << "Derived constructor, allocated data\n";
    }
    ~Derived() {
        delete[] data_; // 派生类释放资源
        std::cout << "Derived destructor, freed data\n";
    }
};

int main() {
    Base* ptr = new Derived(); // 用基类指针指向派生类对象
    delete ptr;                // 通过基类指针删除
    return 0;
}

virtual析构函数的解决方案

在基类的析构函数前加上virtual关键字

c++ 复制代码
#include <iostream>

class Base {
public:
    Base() { std::cout << "Base constructor\n"; }
    // 虚析构函数
    virtual ~Base() { std::cout << "Base destructor\n"; }
};

// Derived类的代码保持不变
class Derived : public Base {
private:
    int* data_;
public:
    Derived() { 
        data_ = new int[100];
        std::cout << "Derived constructor, allocated data\n";
    }
    ~Derived() {
        delete[] data_;
        std::cout << "Derived destructor, freed data\n";
    }
};

int main() {
    Base* ptr = new Derived();
    delete ptr;
    return 0;
}

先调用派生类析构函数释放派生类资源,再调用基类析构函数。内存被完美释放


相关推荐
晚云与城1 小时前
今日分享:C++ Stack和queue(栈与队列)
开发语言·c++
bikong72 小时前
一种高效绘制余晖波形的方法Qt/C++
数据库·c++·qt
深耕AI2 小时前
【MFC文档与视图结构:数据“仓库”与“橱窗”的梦幻联动 + 初始化“黑箱”大揭秘!】
c++·mfc
励志不掉头发的内向程序员3 小时前
STL库——二叉搜索树
开发语言·c++·学习
tan180°4 小时前
Boost搜索引擎 查找并去重(3)
linux·c++·后端·搜索引擎
阿昭L4 小时前
c++中获取随机数
开发语言·c++
3壹4 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
aaaweiaaaaaa5 小时前
c++基础学习(学习蓝桥杯 ros2有C基础可看)
c++·学习·蓝桥杯·lambda·ros2·智能指针·c++类
一拳一个呆瓜5 小时前
【MFC】对话框属性:字体 (Font Name) 和 大小 (Font Size)
c++·mfc
郝学胜-神的一滴5 小时前
基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
c++·qt·线性代数·矩阵·游戏引擎·图形渲染