异常安全的要求
程序的设计应该满足异常安全,而异常安全应该保证当异常发生时我们的程序应该处于一个合法的状态,这种合法的状态的状态有两个基本要求:
- 不能泄露任何资源
- 不允许数据败坏
那么这两点要求具体参考如下代码:
代码要求更改背景图片,但是该操作要保证原子性,因此,先对这个该操作进行上锁,操作完成后释放锁。先将原来的图片删除,然后再更改为新的图像。但是这会有个严重的问题,那就是当new运算符分配空间失败时这个程序实际上就不能保证异常安全,当发生异常,我们的互斥锁将会永远的锁上没无法释放,这就导致资源泄露,而原有的背景已经被删除,但是新的背景却没有被设置,这将导致数据败坏。
1.资源泄露的解决方案
对于资源泄露的解决方案的较为简单,我们仅需要用一个资源管理类来代替我们上锁过程就可以了。
上述的Lock类中,我们互斥锁封装于其中,然后对传入的互斥量进行上锁,当该资源管理类被销毁时,将会由析构函数将该胡扯量释放。
2.数据败坏的解决方案
-
保证基本要求
针对数据败坏的解决方案有两种,一种是满足基本,能够最基本的保证函数处于合法状态但是不能保证完全处于函数调用前的状态。
我们用智能指针来的保证我们改变以前背景失败时不会删除以前的背景。
智能指针中的reset会保证释放以前指向对象的内存的释放,但是这是再指向新的内存空间成功的前提下,如果指向新的空间失败,或者指向不合法的空间,这时会导致指针重置失败,因此,这种情况下并不会删除以前的指针,因此,这就保证了数据不会败坏。导致对于一些稍微复杂的情况,仅用智能指针是没法实现的。因此可以用cpoy-swap技术实现。 -
强烈保证数据安全
为了保证程序能够保证异常发生时恢复到以前的状态,我们可以复制一个副本,在对副本进行操作,操作完成后再交换两个对象即可。这样当异常发生时我们的程序仅是改变了一个副本,而真正使用的对象并没有被改变。
关于交换技术参考: