從文法上面講,析構函數抛出異常是可以的,C++并沒有禁止析構函數引發異常,但是C++不推薦這一做法,從析構函數中抛出異常是及其危險的。
析構函數可能在對象正常結束生命周期時調用,也可能在有異常發生時從函數堆棧清理時調用。前一種情況抛出異常不會有無法預料的結果,可以正常捕獲;但後一種情況下,因為函數發生了異常而導緻函數的局部變量的析構函數被調用,析構函數又抛出異常,本來局部對象抛出的異常應該是由它所在的函數負責捕獲的,現在函數既然已經發生了異常,必定不能捕獲,是以,異常處理機制隻能調用terminate()。若真的不得不從析構函數抛出異常,應該首先檢查目前是否有仍未處理的異常,若沒有,才可以正常抛出。
結論: 當在某一個析構函數中會有一些可能(哪怕是一點點可能)發生異常時,那麼就必須要把這種可能發生的異常完全封裝在析構函數内部,決不能讓它抛出函數之外。
參考資料:
1、http://blog.csdn.net/wind19/article/details/8213406