zoukankan      html  css  js  c++  java
  • 虚析构函数

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

     1 class CBase
     2 {
     3 public:
     4     CBase() { m_pArray = new int[20]; }
     5     ~CBase() { delete [] m_pArray; }
     6 private:
     7     int* m_pArray;
     8 };
     9 
    10 class CDerived : public CBase
    11 {
    12 public:
    13     CDerived() { m_pBuffer = new char[20]; }
    14     ~CDerived() { delete [] m_pBuffer; }
    15 private:
    16     char* m_pBuffer;
    17 };
    18 
    19 int main()
    20 {
    21     CBase* pBase = new CDerived;
    22     delete pBase; // pBase->~CBase()
    23     return 0;
    24 }

    我们知道,delete会触发类的析构函数,一定程度上,我们可以把它当做调用类的析构函数

    那么delete pBase就相当于pBase->~CBase(),此时调用的是CBase::~CBase(),而CDerived::~CDerived()未被调用,这造成了m_pBuffer的内存泄漏。

    为了解决这个问题,我们可以设置CBase析构函数虚函数。由于虚函数多态性pBase->~CBase()实际调用的就会是CDerived::~CDerived()

    CDerived::~CDerived()又会调用CBase::~CBase()。所有的析构函数都被调用了,就不再有内存泄漏发生了。

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

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




    链接:https://www.jianshu.com/p/0df34f868898
    非商业转载请注明出处。
  • 相关阅读:
    Jenkins+postman+Newman之API自动化测试
    python之路——迭代器和生成器
    文件操作
    函数
    python基础数据类型二
    dp的一种理解角度及[NOI2020]命运 题解
    从零开始“发明”Treap
    博客停更
    [转]Linux下C语言-RPC远程调用编程rpcgen用法
    一位编程小白的自述 —— 从小学到现在
  • 原文地址:https://www.cnblogs.com/cpsmile/p/9074357.html
Copyright © 2011-2022 走看看