zoukankan      html  css  js  c++  java
  • c++异常安全和copy and swap策略

    异常安全有两个目标:

    不泄露任何资源。这个通过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总是有开销的,因此“很安全”的情况有些情况下是无法做到的。

  • 相关阅读:
    固定思维的可怕(转)
    Javascript模块化编程:require.js的用法
    js中将字符串转为JSON的三种方式
    cf 55D 数位dp 好题
    fzu 2113 数位dp
    uestc 250 数位dp(水)
    hdu 3652数位dp
    数位dp 3943 二分法
    hdu 3943 经典数位dp好题
    hdu 4871 树的分治+最短路记录路径
  • 原文地址:https://www.cnblogs.com/tonychen-tobeTopCoder/p/5185356.html
Copyright © 2011-2022 走看看