`
tibaloga
  • 浏览: 870725 次
文章分类
社区版块
存档分类
最新评论

为“异常安全的努力”是值得的——effective c++学习笔记

 
阅读更多

异常安全的两个条件:

<!--[if !supportLists]-->1、 <!--[endif]-->不泄露任何资源。

<!--[if !supportLists]-->2、 <!--[endif]-->不允许数据败坏。

fopen函数进行封装。

异常安全函数提供下面的三个异常保证之一:

<!--[if !supportLists]-->1、 <!--[endif]-->基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效的状态下。没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态。

<!--[if !supportLists]-->2、 <!--[endif]-->强烈保证:如果异常被抛出,程序状态不改变。调用这样的函数需要有这样的认知:如果成功,则全部成功,如果失败,则全部失败。

<!--[if !supportLists]-->3、 <!--[endif]-->不抛出异常:承诺不抛出异常,因为他们总是能够完成他们之前承诺的功能。

不要为了表示某件事情发生而改变对象状态,触发那件事情真的发生了。

使用copy and swap原则保证强烈保证:为你打算修改对象(原件)做出一个副本,然后在副本上进行修改。如果抛出异常,源对象仍保持未改变状态。如果未抛出异常,则将修改后的副本和原对象在一个不抛出异常的操作中置换。

请记住:

<!--[if !supportLists]-->1、 <!--[endif]-->异常安全函数及时发生异常也不允许泄露资源或运行数据结构败坏。这种函数区分为三种可能的保证:基本型,强烈型,不抛出异常型。

<!--[if !supportLists]-->2、 <!--[endif]-->“强烈保证”往往能够以“copy-and-swap”来实现,但强烈保证并非对所有函数都可实现或具备现实意义。

<!--[if !supportLists]-->3、 <!--[endif]-->函数提供异常安全保证通常只等于其所调用之各个函数的异常安全保证中的最弱者。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics