異常(exception)
條款09
利用 destructors 避免泄漏資源
即避免裸指針的使用, 將指針包裝進對象里面, 即使用智能指針.
條款10
在 constructors 內阻止資源泄漏
請銘記: 對于"僅部分構造完成"的對象, C++ 拒絕調用其 destructor;
請以智能指針替代原始指針成員;
條款11
禁止異常流出 destructors 之外
這里要考慮到棧展開(stack-unwinding)機制, 即一個函數(shù)拋出異常后, 首先在尋找本身的catch字句, 若不能處理, 就會退出當前函數(shù)(釋放函數(shù)內存, 銷毀局部對象, 但不處理 new 出的對象), 尋找上層的異常處理代碼, 直到找到 catch 字句. 若沒有找到, 就會調用 terminate 結束程序, 終端輸出類似下面的信息:
terminate called after throwing an instance of 'int'
所以. 共有兩種情況會調用 destructor, 1. 對象離開生存空間, 正常析構. 2. 棧展開過程中調用. 對于情況2, 應在 destructor 中捕捉任何異常, 但 catch 字塊為空, 阻止了異常流出 destructor, terminate 也不會被調用.