多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構**,這樣子類中的堆區資源無法釋放。
解決方式:將父類中的析構函式改為虛析構或者純虛析構
虛析構和純虛析構共性:
虛析構和純虛析構區別:
我們來看之前的乙個案例:
class
animal
~animal()
};class
cat:
public animal
void
speak()
string *m_name;
~cat()
cout <<
"cat析構函式呼叫"
<< endl;}}
;
這裡可以看到,cat類多了乙個屬性,並且這個屬性是定義再堆區的指標型別的字串,所以要再析構函式裡加上釋放資源的**。
我們來呼叫以下試試:
可以看到執行時並沒有顯示cat析構函式呼叫了。
那也就是說,cat裡的m_name沒有釋放,一致等到程式關閉時才自動釋放,這回造成記憶體洩漏,是一種漏洞。
那麼怎麼釋放子類中的資源釋放掉呢?
我們只需要將父類中的析構函式改為虛析構函式或者純虛析構函式就行了。
class
animal
virtual
~animal()
};
class
animal
virtual
~animal()
=0;}
;animal::
~animal()
再看執行結果,子類資料可以正常釋放掉:
虛析構和純虛析構
多型使用時,如果子類有屬性開闢到堆區,那麼父類指標在釋放時無法帶呼叫到子類的析構 解決方式 將父類的析構函式改為純虛析構或者虛析構 1.可以解決父類指標釋放子類物件 2.都必須要有具體的函式實現 虛析構和純虛析構的區別 如果是純虛析構,該類屬於抽象類,無法例項化物件 include include ...
虛析構 純虛析構
析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...
4 7 5 虛析構和純虛析構
多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構 解決方式 將父類中的析構函式改為虛析構或者純虛析構 virtual 類名 virtual 類名 0 include include include include using namespace std class a...