虛析構函式

2022-08-30 17:57:16 字數 1074 閱讀 7786

虛析構函式,就是虛的析構函式,也就是析構函式具有了虛函式的性質。

1

class

cbase

25 ~cbase()

6private:7

int*m_parray;8};

910class cderived : public

cbase

1114 ~cderived()

15private:16

char*m_pbuffer;

17};

1819

intmain()

20

我們知道,delete會觸發類的析構函式,一定程度上,我們可以把它當做呼叫類的析構函式

那麼delete pbase就相當於pbase->~cbase(),此時呼叫的是cbase::~cbase(),而cderived::~cderived()未被呼叫,這造成了m_pbuffer的記憶體洩漏。

為了解決這個問題,我們可以設定cbase析構函式虛函式。由於虛函式多型性pbase->~cbase()實際呼叫的就會是cderived::~cderived()

cderived::~cderived()又會呼叫cbase::~cbase()。所有的析構函式都被呼叫了,就不再有記憶體洩漏發生了。

解決因delete基類指標導致的資源洩漏,這就是虛析構函式的作用所在;而具有虛函式性質的析構函式,這就是虛析構函式的真相所在。

下面兩幅圖應該可以幫助你更好地理解:

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...

C 虛析構函式 純虛析構函式

虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...