CPlusPlus - #017 虚析构函数

虚析构函数

1 目标

本文的目的是学习虚析构函数。

2 示例代码

虚析构函数在 C++ 中用于确保正确的析构函数被调用,从而防止内存泄漏。当通过基类指针删除派生类对象时,如果基类析构函数不是虚函数,只有基类的析构函数会被调用,而派生类的析构函数不会被调用,可能会导致资源没有正确释放,造成内存泄漏。

2.1 没有虚析构函数导致内存泄漏

在这个例子中,由于基类的析构函数不是虚函数,当删除基类指针时,只调用了基类的析构函数,而派生类的析构函数没有被调用,导致派生类中动态分配的内存没有被释放,造成内存泄漏。

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }

    // 非虚析构函数
    ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
private:
    int* data;

public:
    Derived() {
        data = new int[100]; // 动态分配内存
        std::cout << "Derived constructor" << std::endl;
    }

    ~Derived() {
        delete[] data; // 释放内存
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    delete basePtr; // 只调用基类的析构函数,派生类的析构函数不会被调用

    return 0;
}
  • 输出
Base constructor
Derived constructor
Base destructor

2.2 使用虚析构函数防止内存泄漏

在这个例子中,由于基类的析构函数是虚函数,当删除基类指针时,会首先调用派生类的析构函数,释放派生类中动态分配的内存,然后调用基类的析构函数,正确地释放所有资源,防止了内存泄漏。

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }

    // 虚析构函数
    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
private:
    int* data;

public:
    Derived() {
        data = new int[100]; // 动态分配内存
        std::cout << "Derived constructor" << std::endl;
    }

    ~Derived() {
        delete[] data; // 释放内存
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    delete basePtr; // 调用基类和派生类的析构函数

    return 0;
}
  • 输出
Base constructor
Derived constructor
Derived destructor
Base destructor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满天飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值