异常安全有两个目标:

不泄露任何资源。这个通过RAII可以做到。

不破坏数据结构。这是下文要讨论的事情

异常安全有三个级别:

基本安全:异常发生后对象和数据结构还有合法状态。实现简单,应该作为最低要求。

很安全:抛出异常后程序状态不变。即要有“原子性”,若成功则完全成功,失败则保持原状。本文的copy and swap策略即是达到这一目的的手段。

不抛出异常:总能实现功能,内置类型可以做到这一点。

所谓copy and swap策略就是先对需要修改的对象做出一份副本,这个副本的构造使用RAII以确保不会资源泄露,在副本上完成所需的修改,如果修改过程中出现异常,原对象仍保持不变。修改完成后,再通过non-throwing swap将副本与原对象交换。  

class String
{
char * str;
public:
String & operator=(const String & s)
{
String temp(s); // RAII
temp.swap(*this); // Non-throwing swap return *this;
}
void swap(String & s) throw() // Non-throwing swap的实现
{
std::swap(this->str, s.str);
}
};

当然,既然要copy总是有开销的,因此“很安全”的情况有些情况下是无法做到的。

c++异常安全和copy and swap策略的更多相关文章

  1. C++异常安全、copy and swap

    异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异 ...

  2. 做个地道的c++程序猿:copy and swap惯用法

    如果你对外语感兴趣,那肯定听过"idiom"这个词.牛津词典对于它的解释叫惯用语,再精简一些可以叫"成语".想要掌握一门语言,其中的"成语" ...

  3. copy and swap技巧与移动赋值操作符

    最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun ...

  4. Effective C++(Third Edition) Item29 为“异常安全”而努力是值得的

    “异常安全”有两个条件: 1.不泄露任何资源 可以通过以对象管理资源的方式(Item13). 2.不允许数据败坏 异常安全函数提供以下三种保证之一 a.基本承诺 如果异常被抛出,程序内的任何事物都仍然 ...

  5. effective C++: 5实现

    五.实现 大多数情况下,适当提出拟的类定义以及函数声明,是花费最多心力的两件事.尽管如此,还是有很多东西需要小心:太快定义变量可能造成效率上的拖延:过度使用转型(casts)可能导致代码变慢又难维护, ...

  6. Effective C++阅读笔记 较详细 复杂条款带样例

    一.让自己习惯C++ 条款01:视C++为一个语言联邦 C++可视为: C:以C为基础. 面向对象的C++:添加面向对象特性. 模板C++:泛型编程概念,使用模板. STL:使用STL的容器.迭代器. ...

  7. 读书笔记 effective c++ Item 29 为异常安全的代码而努力

    异常安全在某种意义上来说就像怀孕...但是稍微想一想.在没有求婚之前我们不能真正的讨论生殖问题. 假设我们有一个表示GUI菜单的类,这个GUI菜单有背景图片.这个类将被使用在多线程环境中,所以需要mu ...

  8. C++中的异常安全性【转】

    原文写的非常好,来自这里 一个函数如果说是“异常安全”的,必须同时满足以下两个条件:1.不泄漏任何资源:2.不允许破坏数据. 我们先通过两个反面的例子开始. 第一个是造成资源泄漏的例子.一个类Type ...

  9. 读书笔记_Effective_C++_条款二十九:为“异常安全”而努力是值得的

    还是举书上的例子: void PrettyMenu::changeBackground(std::istream& imgSrc) { lock(&mutex); delete bgI ...

随机推荐

  1. 去掉Visual Studio 编辑器里中文注释的红色波浪线 转载

    我们通常用visual studio进行开发的时候,我们通常会用到一款比较流行比较方便的插件,那就是Visual Assist X,它可以增强Microsoft开发环境下的编辑能力,支持C/C++,C ...

  2. [lua]尝试一种Case语法糖

    function CaseT(arg) function proxy(caller) caller.yield(r) end -- proxy return function (cond) if (c ...

  3. 从外国html5网站上扒来一个鼠标经过的css3 效果,感觉很不错

    鼠标经过的时候,感觉有点像一张纸卷上去的感觉. 下面是代码 <div class="main-container types"> <div class=" ...

  4. 【elasticsearch】(2)centos7 超简单安装elasticsearch 的监控、测试的集群工具elasticsearch head

    elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...

  5. php ob_ 开头的相关函数

    <?phpbool ob_start([ callback $output_callback [, int $chunk_size [, bool $erase ]]]); /* 打开输出控制缓 ...

  6. win8 + ubuntu14.04 安装步骤

    一.首先,从硬盘上划分一个空闲分区(推荐最少20G,每个人也可以按照自己的需要自行设定).记住各个分区的容量,方便安装时辨认.并从Ubuntu官方网站上下载Ubuntu 14.04 LTS 光盘镜像. ...

  7. 主流的phpcms分析

    小型网站适合wordpress,onethink,joomla(囧啦)    wordpress(免费开源) 优点:1.样式丰富,模板重多 2. 安全性 3. 对搜索引擎友好,收录快.        ...

  8. Laravel之路——事务

    准备: 表必须是InnoDB引擎 DB::beginTransaction(); try{ $name = 'abc'; $result1 = Test::create(['name'=>$na ...

  9. 也说说EM

    也说说EM [本文链接:http://www.cnblogs.com/breezedeus/archive/2012/08/12/2634466.html,转载请注明出处] 前几天看Andrew Ng ...

  10. Codeforces Round #207 (Div. 2)

    A:超级大水题: 代码: #include<cstdio> #define maxn 105 using namespace std; int n,a[maxn],x,y,ans; int ...