美文网首页程序员
真正理解虚析构函数

真正理解虚析构函数

作者: 天律界中子 | 来源:发表于2016-06-22 21:57 被阅读1035次

在我真正理解虚析构函数之前,差不多每隔一个月,我都要百度一下“虚析构函数的作用”。因为我在写一个类时,总是不能确定是否应该将其析构函数写为虚函数。直到某一天,我突然地就悟了。

事实上,虚析构函数,就是析构函数,也就是析构函数具有了虚函数的性质。

有如下代码:

class CBase
{
public:
    CBase() { m_pArray = new int[20]; }
    ~CBase() { delete [] m_pArray; }
private:
    int* m_pArray;
};

class CDerived : public CBase
{
public:
    CDerived() { m_pBuffer = new char[20]; }
    ~CDerived() { delete [] m_pBuffer; }
private:
    char* m_pBuffer;
};

int main()
{
    CBase* pBase = new CDerived;
    delete pBase; // pBase->~CBase()
    return 0;
}

我们知道,delete会触发类的析构函数,一定程度上,我们可以把它当做调用类的析构函数。那么delete pBase就相当于pBase->~CBase(),此时调用的是CBase::~CBase(),而CDerived::~CDerived()未被调用,这造成了m_pBuffer的内存泄漏。

为了解决这个问题,我们可以设置CBase析构函数虚函数。由于虚函数多态性pBase->~CBase()实际调用的就会是CDerived::~CDerived(),而CDerived::~CDerived()又会调用CBase::~CBase()。所有的析构函数都被调用了,就不再有内存泄漏发生了。

解决因delete基类指针导致的资源泄漏,这就是虚析构函数的作用所在;而具有虚函数性质的析构函数,这就是虚析构函数的真相所在。

下面两幅图应该可以帮助你更好地理解:


普通析构函数与虚析构函数

相关文章

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

  • 真正理解虚析构函数

    在我真正理解虚析构函数之前,差不多每隔一个月,我都要百度一下“虚析构函数的作用”。因为我在写一个类时,总是不能确定...

  • C++虚函数的一些奇怪问题总结

    构造函数能否为虚函数?在构造函数中调用虚函数会如何?析构函数能否为虚函数?析构函数能否为纯虚函数?其实日常开发中基...

  • c++primer 15.24-15.30

    15.24基类一般定义一个虚析构函数但是虚析构函数会阻止移动操作但是虚析构函数会帮助基类派生类体系动态销毁对象15...

  • C++的虚析构函数

    首先,我们必须知道,虚析构函数是有其本身的目的,所以正常情况下,我们不应该声明虚析构函数。 构造函数和析构函数是一...

  • C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用...

  • C++第9天: 第137-第142课 纯虚函数,抽象类,虚析构,

    纯虚析构,防止父类指针无法访问子类析构函数

  • ★03.关于单继承

    基类总是要写虚析构函数 通过设置析构函数为纯虚函数来让类称为抽象基类 代码 函数virtual属性的传递性 拷贝移...

  • C++总结

    函数 为什么基类的析构函数用虚函数 在实现多态时,当用基类操作派用类,在析构时防止只析构基类而不析构派生类的状况发...

  • Day1:C++虚机制的实现

    1. 虚析构函数 话不多说,贴代码: 可以看到执行的结果是先调用了 的析构函数,再调用了 的析构函数; 如果将vi...

网友评论

    本文标题:真正理解虚析构函数

    本文链接:https://www.haomeiwen.com/subject/eqendttx.html