C 中的虛析構

2021-09-19 08:55:17 字數 1166 閱讀 4710

首先什麼是虛析構,虛析構就是析構函式為虛函式。

那麼為什麼要用虛析構呢,是為了delete基類指標指向派生類時防止子類得資料不會被釋放造成記憶體洩露。

我們看一下下面的例子:

首先我們定義乙個資料類,mydata

class mydata

~mydata()

private:

char

* m_data = nullptr;

};

接下來定義兩個繼承關係的類objectbaseobject

class objectbase

~objectbase()

};class object : public objectbase

~object()

mydata m_data;

};

然後我們執行下面的**

objectbase *pdata = new object;

delete pdata;

執行結果為:

delete objectbase

可見只有類objectbase被析構了,而類object並沒有被析構,從而這個時候會造成記憶體的洩露。

如果把基類objectbase的析構函式修改為虛析構,如下所示:

class objectbase

virtual ~

objectbase()

};

執行結果為:

delete object

delete data

delete objectbase

類object的記憶體就被釋放了,之前我們講了虛表,可參考之前的這篇文章:

當基類為虛基類時,派生類的物件中基類的__vfptr儲存的為派生類的析構函式。如下圖所示:

文章同步頁:

虛析構和純虛析構 C

解決父類無法釋放子類的堆區記憶體問題。注意 純虛析構無法例項化 虛析構和純虛析構 多型使用時,如果子類有物件開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 虛析構和純虛析構的共性 可以解決父類指標釋放子類物件 都需要有具體的函式實現虛析構和純...

虛析構 純虛析構

析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...

c 中虛析構函式

用c 開發的時候,用來做基類的類的析構函式一般都是虛函式。有下面的兩個類 class clxbase virtual clxbase virtual void dosomething class clxderived public clxbase clxderived void dosomethin...