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
    非商业转载请注明出处。
  • 相关阅读:
    MySql的性能优化
    MySql的备份还原
    MySql的数据目录
    MySql的事务
    MySql的视图
    算法笔记_006:全源最短路径问题【动态规划法】
    算法笔记_005:堆排序问题【变治法】
    算法笔记_004:8枚硬币问题【减治法】
    算法笔记_003:矩阵相乘问题【分治法】
    使用MongoDB和JSP实现一个简单的购物车系统
  • 原文地址:https://www.cnblogs.com/cpsmile/p/9074357.html
Copyright © 2011-2022 走看看