在读effective c++ 为异常安全而努力 这一章节
异常安全的条件或者说是定义:
一、当异常抛出时,不泄露任何资源
比如前面new了一个对象 ,在delete对象之前发生了异常,delete 就不会执行,从而导致了资源的泄露。
二、当异常抛出时,不允许数据破坏
比如
Image* pImg;//里面假设 已经有值
int changeCount=0;
pImg=new Image(imgSrc);
changeCount++;
如果new 抛出异常,pIMg里面就是指向一个空,如果之前里面有值,就被清掉。并且count也累加了 。也就是抛出了异常,而且里面数据被破坏了。
解决方法。
对第一点,以“对象管理资源”,可以防止资源泄漏,利用智能指针 这样的技巧。
对第二点 ,数据破坏的问题,异常安全保证提供 三种级别的承诺:
a 基本型
当异常被抛出,程序中任何事物依然处于有效状态下,没有数据被破坏,但是不可以预料是何种状态。
b强烈型
当异常被抛出,程序状态不发生改变。
c 不抛异常型
承诺绝不抛出异常,因为总是能够完成他们承诺的功能。
异常安全吗必须提供上述三种保证之一。否则就不具备异常安全性。