首先什麼是虛析構,虛析構就是析構函式為虛函式。
那麼為什麼要用虛析構呢,是為了delete基類指標指向派生類時防止子類得資料不會被釋放造成記憶體洩露。
我們看一下下面的例子:
首先我們定義乙個資料類,mydata
class mydata
~mydata()
private:
char
* m_data = nullptr;
};
接下來定義兩個繼承關係的類objectbase和object
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...