这是要把前几年积累的C++的节操给丢光吗
生活随笔
收集整理的這篇文章主要介紹了
这是要把前几年积累的C++的节操给丢光吗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
是java把人給養廢了還是c++的坑太多?
上面的程序有問題嗎?
很嚴重的內存泄露。
C++的多態是通過虛函數實現的,要是不把Base的析構函數設為virtual的,在delete時,就調用base的析構函數了,而不是調用B的析構,然后B中有成員變量vec就沒法釋放了。
解決辦法很簡單,就是在base中添加個virtual的析構函數就行了。
先回憶下類的構造順序,先構造基類,再構造派生類
具體的講就是在構造類的時候,先構造基類,在構造當前類的成員變量,最后調用當前類的構造函數
析構的時候順序相反
看上面的程序,delete b的時候,因為Base沒有virtual的析構函數,所以,只會調用Base的析構函數,而不會調用B的析構函數,因為B的成員變量是在調用B的析構函數只會再析構的,所以,B的成員變量也不會被析構
剛開始看B類,是兩個非指針類型的成員變量,所以,即使沒有調用B類的默認生成的析構函數,只調用Base類的析構函數,應該也不會有內存泄露。但是,要注意的是,string和vector內部實現都只是一個指針,然后向堆中申請內存,如果不調用默認生成的析構函數,那么也不會析構string和vector,造成內存泄露。
解決方案:如果有繼承的話,基類一定要有虛析構函數
總結
以上是生活随笔為你收集整理的这是要把前几年积累的C++的节操给丢光吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: g++小白错误
- 下一篇: android Activity布局初步