读书笔记《Effective C++》条款29:为“异常安全”而努力是值得的

来源:互联网 发布:淘宝天猫 购物心得 编辑:程序博客网 时间:2024/05/21 07:11

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

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

2.强烈保证:如果异常被抛出,程序状态不改变。调用这样的函数需有这样的认知:如果函数成功,就是完全成功;如果函数失败,程序会回复到“调用函数之前”的状态。

3.不抛掷(nothrow)保证:承诺绝不抛出异常,因为它们总是能够完成它们原先承诺的功能。作用于内置类型(例如int,指针等等)身上的所有操作都提供nothrow保证。

异常安全码必须提供上述三种保证之一。如果它不这样做,它就不具备异常安全性。

一般而言应该会想到提供可实施之最强烈保证。从异常安全性的观点视之,nothrow函数很棒,但我们很难完全没有调用任何一个可能抛出异常的函数。任何使用动态内存的东西(例如所有STL容器)如果无法找到足够内存以满足需求,通常变会抛出一个bad_alloc异常。是的,可能的话请提供nothrow保证,但对大部分函数而言,抉择往往落在基本保证和强烈保证之间。

当“强烈保证”不切实际时,必须提供“基本保证”。现实中或许会发现,可以为某些函数提供强烈保证,但效率和复杂度带来的成本会使它对许多人而言摇摇欲坠。

当撰写新代码或修改代码时,请仔细想想如何让它具备异常安全性。首先是“以对象管理资源”,那可阻止资源泄露。然后是挑选三个“异常安全保证”中的某一个实施于所写的每一个函数上。应该挑选“现实可实施”条件下的最强烈等级,只有当你的函数调用了传统代码,才别无选择地将它设为“无任何保证”。


要点:

1.异常安全函数即使发生异常也不会泄露资源或允许任何数据结构破坏。这样的函数区分为三种可能的保证:基本型、强烈型、不抛异常型。

2.“强烈保证”往往能够以copy-and-swap实现出来,但“强烈保证”并非对所有函数都可实现或具备现实意义。

3.函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者。

阅读全文
0 0