Effective C++ 第八條Prevent exception from leaving destructors.
別讓異常逃離析構函數(shù)
????????C++不禁止析構函數(shù)拋出異常但是也不提倡這樣的做法,因為有可能原本析構函數(shù)承擔了釋放內存的任務,而異??赡軐е挛鰳嫼瘮?shù)沒執(zhí)行完就程序結束了,從而內存泄漏。以下有個例子

????????假設 v 中有2個 Wiget,其中2個Wiget都在析構的時候拋出異常,此時程序不是結束執(zhí)行就是導致不明確行為,會在釋放 v 之前而程序提前結束,導致內存沒有釋放。

????????方式一采取的方法是遭遇錯誤就停止執(zhí)行程序,此行為較為合理,也就是阻止不明確行為發(fā)生。
????????方法二采取的是吞下因調用close而發(fā)生的異常,這種行為一般是不好的,因為導致錯誤信息無法立馬顯示。但是有時候比如“草率結束程序”和“發(fā)生不明確行為”來說要好。
一個較好的解決方法
????????如果實在需要在析構函數(shù)中使用異常,那么可以通過給客戶留接口來實現(xiàn),就是析構函數(shù)本身釋放一次,又顯式的給客戶留出一個釋放接口,在程序拋出異常的時候控制離開析構函數(shù)也能讓客戶來釋放資源。

????????此類問題復雜的時候很難依靠程序員獨自處理,因為情況和問題多種多樣,需要客戶和開發(fā)者一起解決。留出一個接口給客戶也不失為一種補救方法。
標簽: