先看**:
這樣是沒問題的(c++編譯器會以構造相反的順序執行析構函式),但是,在很多時候,我們不能在呼叫函式末尾就delete掉這個記憶體,還需要和後續互動。比如作為函式引數,為了實現多型,我們函式引數是父類的指標,所以更常見和一般的設計思維是更改paly和main函式如下:
執行結果顯示記憶體洩漏了,只析構了父類;所以我們有那麼一種需求,要想和多型的效果一樣,傳什麼指標去,自動析構應該析構的東西,更改**,實現虛析構函式。
只用更改基類的析構函式,加上virtual關鍵字:
這樣就沒有記憶體洩漏了。
知識簡要:
如果基類的析構函式不是虛函式,則delete乙個指向派生類物件的基類指標將產生未定義的行為。之前我們介紹過乙個準則,如果乙個類需要析構函式,那麼它同樣需要拷貝和賦值操作。基類的析構函式並不遵循上述準則,它是乙個重要的例外。
c 之虛析構函式
析構函式的作用是在物件撤銷之前做必要的 清理現場 的工作。當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情...
C 之虛析構函式
相信大家都已經清楚了虛函式這個概念。在c 中,建構函式不能宣告為虛函式,而析構函式卻可以宣告為虛函式,大家可能對為什麼要把析構函式宣告為虛函式很疑惑,下面,雲主 博主 就帶大家去會會這個虛析構函式 首先,先看一段 incldue using namespace std class base 建構函式...
C 之虛析構函式
虛析構函式 如果乙個類有子類,則這個類 父類 的析構函式必須是虛函式 如果父類的析構函式不是虛函式,則當 delete 刪除乙個指向子類物件的父類指標 時,將呼叫父類版本的析構函式,子類只釋放了來自於父類的那部分成員變數,而子類自己擴充套件的成員變數沒有被釋放,造成記憶體洩漏 include std...