zoukankan      html  css  js  c++  java
  • Effective C++ Item 29 为”异常安全”而努力是值得的

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


    经验:异常安全函数即使发生异常也不会泄漏资源或同意不论什么数据结构败坏。这种函数区分为三种

    可能的保证:
    基本型-->发生异常。程序处于某个合法状态
    强烈型-->发生异常。程序处于原先状态
    不抛异常型-->承诺绝不抛出殿堂


    演示样例:
    class PrettyMenu{
    public:
    	//...
    	void changeBackground(std::istream &imgSrc); //改变背景图像
    	//...
    private:
    	Mutex mutex;     //相互排斥器
    	Image *bgImage;  //眼下的背景图像
    	int imageChanges;//背景图像被改变的次数
    };
    
    
    void PrettyMenu::changeBackground(std::istream &imgSrc){
    	lock(&mutex);
    	delte bgImage;
    	++imageChanges;
    	bgImage = new Image(imgSrc);
    	unlock(&mutex);
    }
    

    解析:
    泄漏资源:new Image(imgSrc) 导致异常的话,相互排斥器就不会 unlock
    数据败坏:new Image(imgSrc) 导致异常的话,bgImage指向一个已删除的对象,imageChanges 也已被累加

    纠正:
    class PrettyMenu{
    	//...
    	std::tr1::shared_ptr<Image> bgImage; //以对象管理资源
    	//...
    };
    
    
    void PrettyMenu::changeBackground(std::istream &imgSrc){
    	Lock ml(&mutex); // 以对象管理资源
    	bgImage.reset(new Image(imgSrc)); // 以"new Image" 的运行结果设定 bgImage 内部指针
    	++imageChanges;
    }
    

    解析:
    delte 仅仅有 reset 函数内被使用。 而 shared_ptr::reset 函数仅仅有在其參数被成功生成之后才会被调用。


    //todo
  • 相关阅读:
    Linux Shell 下的输出重定向
    解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫
    数据清洗基本概念
    前端常见的跨域请求解决方案
    Pandas模块:表计算与数据分析
    Matplotlib模块:绘图和可视化
    numpy如何使用
    Gerapy 使用详解
    MySQL常见数据库引擎及比较
    基于scrapy-redis组件的分布式爬虫
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5060417.html
Copyright © 2011-2022 走看看