阅读 48

[读书笔记]《More Effective C++》 - 异常

《More Effective C++》读书笔记

异常

条款9: 利用destructors避免泄漏资源

理解: 将一个对象存放在必须被自动释放的的资源里,并依赖该对象的destructor释放,可有效避免出现exceptions发生资源泄漏。 例如可用智能指针auto_ptr指向创建的对象,实现这一设计。

条款10: 在constructors内阻止资源泄漏(resource leak)

理解: 论述如何处理在构造函数中发生异常而导致的资源泄漏,即用auto_ptr对象代替pointer class members对象,无须在析构函数中手动释放资源。

条款11: 禁止异常(exceptions)流出destructors之外

理解: 论述了析构函数内发生的异常必须要在其函数内被捕捉到的两个原因:

  • (1)可以避免terminate函数在exceptions传播过程中的栈展开(stack-unwinding)机制中被调用。如果控制权基于exception的因素离开destructor,而此时正有另一个exception处于作用状态,c++会调用terminate函数。
  • (2)可以确保destructor完成其应该完成的所有事情。

条款12: 了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异。

理解: 主要有三个差异

  • (1)exception objects总是会被复制,如果是以by value方式捕捉,会被复制两次。
  • (2)“被抛出成为exception”的对象,允许的类型转换比“传递到函数去”的对象少。“exception与catch子句相匹配”的过程中,只支持两种类型转换,一种是继承体系中的类转换(基类可以捕捉到子类),二是从一个“有型指针”转为“无型指针”(针对const void*指针设计的catch子句,可以捕捉到任何指针类型的exception)。
  • (3)catch 子句匹配的机制是“first fit”。

条款13: 以by reference方式捕捉exceptions

理解: 论述了by pointer,by value以及by reference三种方式传递异常给catch的优劣,最后得出结论是以by reference方式,原因概要如下:

  • (1)以by pointer方式传递需要考虑传递过来的对象的删除问题,比较难处理,有的时候需要删除,有的时候不需要。
  • (2)以by value方式会出现切割问题,即用基类捕捉到了子类的异常对象,会丢失子类的派生成分,其实就是变成了子类对象。在调用虚函数的时候,仍然只会调用基类的函数而不是子类的函数。

条款14: 明智运用exception spectifications

理解: exceptions specifications不太好使。

条款15: 了解异常处理(exception handling)的成本

理解:

  • 只要能够不支持exception,编译器便不支持。
  • 斤可能不用try语句块和exception specification,因为那样会使代码膨胀。
文章分类
阅读
文章标签