“异常安全”有两个条件: 1.不泄露任何资源 可以通过以对象管理资源的方式(Item13). 2.不允许数据败坏 异常安全函数提供以下三种保证之一 a.基本承诺 如果异常被抛出,程序内的任何事物都仍然保持在有效状态下,但是何种状态未知. b.强烈保证 如果异常被抛出,程序状态不改变. c .不抛掷(nothrow)保证 注意:不要为了表示某件事情发生而改变对象状态,除非那件事情真的发生了. copy and swap策略. 总结:异常安全函数即使发生异常也不会泄漏资源或允许任何数据结构败坏,这样…
异常安全函数(Exception-safe functions)即使发生异常也不会泄露资源或允许任何数据结构败坏.这样的函数区分为三种可能的保证:基本型.强烈型.不抛异常型. “强烈保证”往往能够以copy-and-swap实现出来,但“强烈保证”并非对所有函数都可实现或具备现实意义. 函数提供的“异常安全保证”通常最高只等于其所调用之各个函数的“异常安全保证”中的最弱者.…
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:异常安全函数即使发生异常也不会泄漏资源或同意不论什么数据结构败坏.这种函数区分为三种 可能的保证: 基本型-->发生异常.程序处于某个合法状态 强烈型-->发生异常.程序处于原先状态 不抛异常型-->承诺绝不抛出殿堂 演示样例: class PrettyMenu{ public: //... void changeBackground(std::istream &im…
假设有个class用来表现夹带背景图案的GUI菜单单,这个class用于多线程环境,所以它有个互斥器(mutex)作为并发控制用: class PrettyMenu{ public: ... void changeBackground(std::istream& imgSrc); ... private: Mutex mutex; Image* bgImage; int imageChanges; }; void PrettyMenu::changeBackground(std::istream…
(一)先看以下这些代码: class PrettyMenu { public: void changeBackground(istream& imgSrc); private: Mutex mutex; //由于这个class希望用于多线程环境,所以它有这个相互排斥器作为并发控制之用 Image* bgImage; //眼下的背景图像 int imageChanges; //背景图像被改变的次数 }; void PrettyMenu::changeBackground(std::istream…
还是举书上的例子: void PrettyMenu::changeBackground(std::istream& imgSrc) { lock(&mutex); delete bgImage; ++ imageChanges; bgImage = new Image(imgSrc); unlock(&mutex); } 这段代码大致的意思就是改变背景图片,删掉旧的背景图片,记录修改次数,然后创建新的背景图片.考虑到多线程操作,所以这里用了lock和unlock. 但这里会出现问题…
当异常被抛出时,带有异常安全性的函数: 1.不泄露任何资源 2.不允许数据败坏   异常安全函数提供以下三个保证之一: 1.基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效的状态下.没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态. 2.强烈保证:如果异常被抛出,程序状态不改变.调用这样的函数需有这样的认知:如果函数成功,就是完全成功,如果函数失败,程序会回复到"调用函数之前"的状态. 3.不抛掷保证,承诺绝不抛出异常,因为他们总是能够完成它们原先承诺的…
析构函数绝对不要吐出异常.如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序. 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作.…
1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做.这是有原因的,考虑下面的代码: class Widget { public: ... ~Widget() { ... } // assume this might emit an exception }; void doSomething() { std::vector<Widget> v; ... } // v is automatically destroyed here 当vector V被…
推荐序 前言 致谢 第一章 引言 第二章 创建和销毁对象 第1项:用静态工厂方法代替构造器 第2项:遇到多个构造器参数时要考虑使用构建器 第3项:用私有构造器或者枚举类型强化Singleton属性 第4项:通过私有构造器强化不可实例化的能力 第5项:优先考虑依赖注入来引用资源 第6项:避免创建不必要的对象 第7项:消除过期的对象引用 第8项:避免使用终结方法和清除方法 第9项:try-with-resources优先于try-finally 第三章 对于所有对象都通用的方法 第10项:覆盖equ…