我們知道,建構函式是用來在建立物件時初始化物件的,做一些賦初值等操作,那麼相對的,析構函式是為了在結束物件的生命週期時做善後工作,比如在建構函式中申請的記憶體就需要在析構函式中釋放(過程中根據情境已經做了特殊處理釋放了記憶體的除外),構造和析構不需要主動呼叫,由系統自動呼叫,當類中沒有析構函式時,系統會自動生成,類的析構函式主要是為了釋放記憶體資源,析構函式如果不被呼叫的話就可能會造成記憶體洩漏。
和虛函式一樣,虛析構函式就是在析構函式之前加個virtual,為什麼要這樣做呢,先看一下下邊這個例子:
從輸出中可以看出,當指標指向子類,delete時會先呼叫子類的析構函式,再呼叫父類的析構函式,而當指標指向父類,delete時只呼叫父類的析構函式,子類的析構函式不會被呼叫,如果子類的析構函式裡有釋放記憶體的操作,也同樣不會執行,就造成了記憶體洩漏。而如果把父類的析構函式變為虛析構函式,又會怎麼樣呢,對上邊的例子小小改動一下:
這一次當指標指向父類,delete時先呼叫了子類的析構函式,再呼叫父類的析構函式,只是在父類的析構函式前多加了乙個virtual結果就完全不同了。
通過上邊的兩小段**,應該有所體會虛析構函式究竟要做什麼了,虛析構函式是為了確保當指標指向基類時,刪除能夠徹底,但是也並不是所有類的析構函式都要寫成虛析構函式的,只有當乙個類作為基類使用,才需要把析構函式寫成虛函式的形式。
c 之虛析構函式
析構函式的作用是在物件撤銷之前做必要的 清理現場 的工作。當派生類的物件從記憶體中撤銷時一般先呼叫派生類的析構函式,然後再呼叫基類的析構函式。但是,如果用new運算子建立了臨時物件,若基類中有析構函式,並且定義了乙個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生乙個情...
C 之虛析構函式
相信大家都已經清楚了虛函式這個概念。在c 中,建構函式不能宣告為虛函式,而析構函式卻可以宣告為虛函式,大家可能對為什麼要把析構函式宣告為虛函式很疑惑,下面,雲主 博主 就帶大家去會會這個虛析構函式 首先,先看一段 incldue using namespace std class base 建構函式...
C 之虛析構函式
虛析構函式 如果乙個類有子類,則這個類 父類 的析構函式必須是虛函式 如果父類的析構函式不是虛函式,則當 delete 刪除乙個指向子類物件的父類指標 時,將呼叫父類版本的析構函式,子類只釋放了來自於父類的那部分成員變數,而子類自己擴充套件的成員變數沒有被釋放,造成記憶體洩漏 include std...