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;
}

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


相关推荐
你的冰西瓜5 小时前
C++20 新特性详解:相较于 C++17 的主要改进
开发语言·c++·stl·c++20
止观止5 小时前
C++20 Ranges:告别手写循环,像 SQL 一样操作数据
c++·stl·c++20·编程范式·ranges
郝学胜-神的一滴7 小时前
现代OpenGL窗口管理:GLFW从入门到实战
开发语言·c++·程序人生·图形渲染·个人开发
Bona Sun7 小时前
单片机手搓掌上游戏机(十六)—pico运行fc模拟器之程序修改烧录
c语言·c++·单片机·游戏机
谁刺我心7 小时前
C++三种智能指针unique、shared、weak
开发语言·c++
9ilk7 小时前
【C++】 --- 哈希
c++·后端·算法·哈希算法
小邓   ༽8 小时前
50道C++编程练习题及解答-C编程例题
c语言·汇编·c++·编程练习·c语言练习题
报错小能手8 小时前
数据结构 定长顺序表
数据结构·c++
qq_419203238 小时前
深浅拷贝、STL迭代器失效
c++·深浅拷贝·stl迭代器失效
再卷也是菜9 小时前
C++篇(21)图
数据结构·c++·算法