天天看點

delete基類指針釋放子類對象

1、首先需要了解父類和子類的記憶體分布

如下圖,B類(子)繼承A類(父):

delete基類指針釋放子類對象

2、其次就是delete删除對象原理

delete就是依據指針指向的記憶體位址,如何删除記憶體資料,具體删除多少呢?那就看指針類型了。

如果指針類型為A*,那就删除A類大小的記憶體。

3、按1、和2中的内容,那麼冒出一個問題!

看如下代碼:

A* a = new B();			//按上圖方式,B繼承于A

delete a;
           

父類指針指向子類對象的情況會怎麼删除?

依據上面内容推測,B類中的A對象段的記憶體将會被删除,而剩餘的B自己的資料将不會,這樣不是造成記憶體洩漏了!!!貌似好像是這樣。

4、針對這個問題有什麼解決方法?

将父類析構函數設定為虛函數,也就是函數前面加“virtual”即可解決此問題。

這樣的情況下,delete a會先執行子類的析構函數後,再執行父類的析構函數。

(1) 父類析構函數不虛化,運作情況如下:

A();
B();
~A();
           

(2) 父類析構函數設為虛函數,運作情況如下:

A();
B();
~B();	//!!! 不同點 !!!
~A();