C++异常安全、copy and swap】的更多相关文章

异常安全有两个目标: 不泄露任何资源.这个通过RAII可以做到. 不破坏数据结构.这是下文要讨论的事情 异常安全有三个级别: 基本安全:异常发生后对象和数据结构还有合法状态.实现简单,应该作为最低要求. 很安全:抛出异常后程序状态不变.即要有“原子性”,若成功则完全成功,失败则保持原状.本文的copy and swap策略即是达到这一目的的手段. 不抛出异常:总能实现功能,内置类型可以做到这一点. 所谓copy and swap策略就是先对需要修改的对象做出一份副本,这个副本的构造使用RAII以…
异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异常透明的.) 2.异常安全性: 抛出异常后,资源不泄露, 抛出异常后,不会使原有数据恶化(例如正常指针变野指针) 少些try catch,因为大量的try catch会影响代码逻辑.导致代码丑陋混乱不优雅 一段代码要具有异常安全性,必须同时具有异常中立性和一定等级的异常安全性保证 异常安全的等级一般…
如果你对外语感兴趣,那肯定听过"idiom"这个词.牛津词典对于它的解释叫惯用语,再精简一些可以叫"成语".想要掌握一门语言,其中的"成语"是不能不学的,而希望成为地道的语言使用者,"idiom"则是必不可少的.程序语言其实和外语也很类似,两者都有自己的语法,一个个函数也就像一个个词汇,大部分的外语都是自然语言,有着深厚的历史文化底蕴,因此有不少idiom,而编程语言虽然只有短短数十岁,idiom却不比前者少.不过对于程序设计…
最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun& rhs) throw(); Fun& operator=(Fun fun) { swap(fun); return *this; } void swap(Fun& other) throw(); }; 这个类实现了copy and swap技巧,在赋值的时候表现的很好.但是如果再加…
条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函数和析构函数:主要是给编译器一个地方用来放置“藏身幕后”的代码,像是调用base classes和non-static成员变量的构造和析构函数:当我们显式声明了一个构造函数,编译器于是不再为我们的类创建default构造函数. 2. 如果你打算在一个“内含reference成员”的class内支持赋…
1.swap交换对象值,std提供了实现方法模版的实现,它的实现是交换对象值. namespace std { template<typename T> void swap(T& a,T& b) { T temp(a); a = b; b = a; } } 2.考虑下面的情况下,资源管理类Widget,内部只有一个指针WidgetImpl,该指针指向一个对象,这个对象中包含真正数据.对这种资源管理类执行swap,如果调用std中的swap,有哪些动作?对于Widget,copy…
转载地址 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. ,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指…
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指针是in…
原文来自:http://www.cnblogs.com/xloogson/p/3360847.html 1.C++最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符 template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2.针对int型优化: void swap(int & __restrict a, int & __restr…
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } 需要构建临时对象,一个拷贝构造,两次赋值操作. 2,针对int型优化: void swap(int & __restrict a, int & __restrict b) { a ^= b; b ^= a; a ^= b; } 无需构造临时对象,异或 因为指针是in…