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语言---typedef
c语言·c++·算法
带土11 天前
5. enum(枚举)关键字在C/C++中的作用
c语言·c++
驴友花雕1 天前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕1 天前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
Qhumaing1 天前
C++学习:【PTA】数据结构 7-1 实验7-1(最小生成树-Prim算法)
c++·学习·算法
Z1Jxxx1 天前
01序列01序列
开发语言·c++·算法
坚定学代码1 天前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai
ha20428941941 天前
Linux操作系统学习记录之---TcpSocket
linux·网络·c++·学习
AI视觉网奇1 天前
ue5 插件 WebSocket
c++·ue5
左直拳1 天前
将c++程序部署到docker
开发语言·c++·docker