【個人紀錄】C++面試總結之一(多態)

不嚴謹之處較多,歡迎大佬指正,在學習的路上不斷狂奔
比如面試官問了一個多態問題,然後就可以針對多態這個問題適當展開,不至於問你一個就回答這一個問題,無法完全展示自己技能,適當的展開可以爲面試加分喲
開始:
多態分爲靜態多態、動態多態。靜態多態,重載,就是在同一作用域內,函數名相同,參數不同,根據參數來確定調用。動態多態,重寫,主要是虛函數,父類指針指向子類對象,接着再用指針調用被重寫函數。一個類有虛函數,就有虛函數表,虛函數表裏存放的就是每個虛函數的地址,若子類未重寫虛函數,那麼虛函數表中的虛函數的地址就還是父類的虛函數的地址,一旦子類重寫了,那麼這個地址就會變成重寫之後的虛函數的地址。
說到虛函數,如果 一個類要子類,那麼它的析構函數一定要聲明爲虛函數,不然會造成內存泄漏,原因在於,如果父類的析構函數不是虛函數,那麼在銷燬對象時,只會調用父類析構函數,子類對象無法釋放,導致內存泄露;如果父類析構函數是虛函數。那麼在釋放時,首先調用子類析構,使得子類對象得以釋放,接着進入父類析構,釋放父類對象,這樣父類子類都得以完全釋放。這就是爲什麼父類析構必須是虛函數的原因。
再講到內存泄漏,內存泄漏是C++開發中比較容易出現的現象,往輕的說,一個項目運行速度及效率會降低,慢慢變卡,體驗會急劇下降,嚴重的話可能會導致機器崩潰和死機,所以在開發過程中內存泄漏需要尤爲重視。動態分配內存比較常用,比較容易出現未釋放或者釋放不完全的情況,也很難發現哪塊造成內存泄漏了,可以通過一些內存泄漏檢測工具來定位防止,這個後面講。這裏着重說一下C++令一個有效防止內存泄漏的方法—智能指針!
智能指針有自動指針、共享指針、唯一指針、弱指針。
若使用智能指針,則不需程序員自己釋放,智能指針機制就是自動釋放已申請的內存。auto_ptr在C++11當中雖然已標爲棄用,但還可以用,在C++17中就完全移除了。原因在於auto_ptr在釋放的時候使用delete而不使用delete[],這樣就會造成內存泄漏,故不再使用。還有唯一指針、弱指針、共享指針。這裏說一下比較重要的共享指針,只說核心:多個指針指向同一塊內存,在這塊內存上每多一個指針指向它,那麼它的引用計數就會+1,在釋放的時候,每釋放一個指針,那麼它的引用計數就會-1,直到它的引用計數減到0,纔會得到完全釋放。
通過檢測工具來排查內存泄漏事件是一個非常有效的手段。上面提到了VLD內存泄漏檢測工具,該工具運行起來後可直接在項目中看到那一塊造成內存泄漏了,甚至可以具體看到哪一行有問題,定位出來之後可以針對性避免,可以大大提高產品的健碩性。
提到內存泄漏就難以不提到內存溢出,內存泄漏基本就是未釋放或者釋放不完全導致,那麼內存溢出呢,舉個很簡單的例子:比如現在需要開闢10個字節的內存,但是系統只剩5個字節的大小了,這個時候就會造成內存溢出;再有就是數組溢出也是內存溢出的典型示例。這樣就可以很清楚的搞明白泄漏和溢出是怎麼回事了。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章