虛析構函式的作用之美

2021-10-02 23:31:05 字數 1598 閱讀 6781

首先,對於虛析構函式,那就得說下建構函式和析構函式了。

建構函式:進行初始化成員變數的函式。

析構函式:在物件生命週期結束的時候,完成資源的**和清理。

如果我們在設計乙個類的時候,沒有顯示宣告定義建構函式,析構函式,則編譯器會自動生成。

虛析構函式:只有當乙個類被定義為基類的時候,才會把析構函式寫成虛析構函式。

如果我們不需要使用基類對派生類的物件操作時,我們也不必去定義虛析構函式,這樣會增加系統的記憶體開銷,當類裡面有虛析構函式時,系統會為當前類分配乙個虛函式表,裡面存放虛函式指標,這樣就會增加類的儲存空間。關於虛函式表的一些知識,可以訪問:  。

對於虛析構,就是在析構函式前加virtual關鍵字,那麼到底有什麼作用呢?

防止記憶體洩露,定義乙個基類的指標p,在delete p時,如果基類的析構函式是虛函式,這時只會看p所賦值的物件,如果p賦值的物件是派生類的物件,就會呼叫派生類的析構函式(毫無疑問,在這之前也會先呼叫基類的建構函式,在呼叫派生類的建構函式,然後呼叫派生類的析構函式,基類的析構函式,所謂先構造的後釋放);如果p賦值的物件是基類的物件,就會呼叫基類的析構函式,這樣就不會造成記憶體洩露。

如果基類的析構函式不是虛函式,在delete p時,呼叫析構函式時,只會看指標的資料型別,而不會去看賦值的物件,這樣就會造成記憶體洩露。

下面是具體的**演示:

從執行結果中可以的到:

- 當子類指標指向子類時,析構函式會先呼叫子類析構在呼叫父類析構,釋放所有記憶體。

- 但父類指標指向子類時,只會呼叫父類析構函式,子類析構函式不被呼叫,會造成記憶體洩漏。

所以我們才需要虛析構函式,將父類的析構函式定義為虛析構函式,那麼父類指標會先呼叫子類析構,在呼叫父類析構,是記憶體得到釋放。

從執行結構可以看出:

- 將父類定義為虛析構函式後,當定義一直父類指標指向子類時,在delete時可以呼叫子類和父類的析構函式,釋放所有的記憶體,防止記憶體洩漏。

虛析構函式的作用

析構函式的作用就在於我們呼叫完乙個類物件時,為了避免記憶體洩漏,我們必須刪除這個類物件,這時析構函式就派上用場了。但是,當我我們定義乙個基類指標指向派生類後,再刪除這個指標時我們會發現,程式只是呼叫了基類的析構函式,卻沒有呼叫派生類的析構函式。為了解決這個問題,虛析構函式閃亮登場!當!當!當!虛析構...

虛析構函式的作用

我們知道,用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明 有下面的兩個類 class clxbase public clxbase virtual clxbase virtual void dosomething class clxderiv...

虛析構函式的作用

虛析構函式的作用 析構函式的作用 類的析構函式是為了釋放記憶體資源,析構函式不被呼叫的話就會造成記憶體洩漏。虛析構函式 定義為虛析構函式是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。但並不是要把所有類的析構函式都寫成虛函式。只有當乙個類被用來作為基類的時候,才把析構函式寫...