c++异常安全和copy and swap策略

本文详细阐述了异常安全的概念及其三个级别:基本安全、很安全、不抛出异常。着重介绍了如何通过copyandswap策略实现‘很安全’级别的异常安全,即在异常发生时保持程序状态不变。通过类String的实例演示了这一策略的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常安全有两个目标:

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

转载于:https://www.cnblogs.com/tonychen-tobeTopCoder/p/5185356.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值