虚析构函数,就是虚的析构函数,也就是析构函数具有了虚函数的性质。
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
非商业转载请注明出处。