当前位置: 首页 > news >正文

网站登录页面空白宁波网站建设公司地址

网站登录页面空白,宁波网站建设公司地址,咖啡网站建设的需求分析,班级网站建设开题报告为"异常安全"而努力是值得的! 什么是异常安全? 所谓的"异常安全",往往值得是函数接口的异常安全,它要求函数满足两个条件: 异常抛出时: 1、不泄露任何资源 2、不允许数据被破坏 异常安…

为"异常安全"而努力是值得的!

什么是异常安全?
所谓的"异常安全",往往值得是函数接口的异常安全,它要求函数满足两个条件:
异常抛出时:

1、不泄露任何资源
2、不允许数据被破坏

异常安全分为哪些情况呢?
答:一共由三种情况。1、基本保证 2、强烈保证 3、nothrow保证

1、基本保证什么意思?
异常被抛出,所有数据仍然处于有效状态,对象处于内部的前后一致。但现实状态无法预料

2、强烈保证什么意思?
异常被抛出,如果成功,就是完全成功;如果失败,就回复到之前的状态

3、nothrow保证什么意思?
保证绝不抛出任何异常,总是能够成功。常作用域内置类型(int、指针等)

举例如下:
有个class用来表示带背景图案的GUI菜单,它希望用于多线程环境。

class Menu
{
public:void changeBackground(std::istream& imSrc); //改变背景
private:Mutex mutex;      //互斥锁Image* bgImage;   //背景图片int imageChanges; //背景改变次数
}void Menu::changeBackground(std::istream& imSrc)
{lock(&mutex);delete bgImage; // flag ++imageChanges;bgImage = new Image(imSrc);unlock(&mutex);
}

从异常安全性来看,这个函数很糟糕,一个条件都没有满足:

  • (1)、假设 flag 处抛出异常,则原本对象的数据被破坏
  • (2)、因为抛出异常,导致已经lock的互斥锁也没有释放,永远处于加锁状态

那么如何解决(1)的问题?
通过RAII手法,对资源进行封装的使用。
例如:

void Menu::changeBackground(std::istream& imSrc)
{Lock m(&mutex);  //Lock包裹互斥锁delete bgImage; // flag ++imageChanges;bgImage = new Image(imSrc);
}

如何解决(2)的问题?
合理并巧妙的安排代码语句的顺序。

class Menu
{
public:void changeBackground(std::istream& imSrc); //改变背景
private:Mutex mutex;      //互斥锁std::shared_ptr<Image> bgImage;   //背景图片int imageChanges; //背景改变次数
}void Menu::changeBackground(std::istream& imSrc)
{Lock m(&mutex);  //Lock包裹互斥锁bgImage.reset(new Image(imSrc)); //这里如果new失败,内部并不会改变原本的bgImage数据++imageChanges;
}

上述几乎已经能够达到强烈保证的要求了,但是唯独有一个点没有考虑到,如果Image的构造函数抛出异常,那么原本的istream的流数据状态已经发生改变,所以上述只能算是基本承诺

那么有什么好的方法能够弥补这一缺陷呢?
通过copy-and-swap技术!
它的原理就是:
1、为打算修改的对象做出一份副本
2、对副本做相应需要的修改
3、将副本和原本的对象进行swap置换

注: 往往针对数据修改的swap,需要数据本身在一个类中,并且拥有这个类实例化的指针才行

举例:

struct PMImpl
{std::shared_ptr<Image> bgImage;int imageChanges;
}class Menu
{
public:void changeBackground(std::istream& imSrc); //改变背景
private:Mutex mutex;      //互斥锁std::shared_ptr<PMImpl> pImpl;
}void Menu::changeBackground(std::istream& imSrc)
{Lock m(&mutex);  //Lock包裹互斥锁std::shared_ptr<PMImpl> pNew(new PMImpl(*pImpl)); //1、拷贝副本pNew->bgImage.reset(new Image(imSrc));  //2、对副本修改++pNew->imageChanges;using std::swap;swap(pNew,pImpl); //3、进行swap置换
}

综上,这样基本上就达成了我们的强烈保证的目的了

结尾: 我是航行的小土豆,喜欢我的程序猿朋友们,欢迎点赞+关注哦!希望大家多多支持我哦!有相关不懂问题,可以留言一起探讨哦!

如有引用或转载记得标注哦!

http://www.yayakq.cn/news/701412/

相关文章:

  • wordpress网站做h5分类秦皇岛 网站建设
  • 山东淄博微信网站制作深圳 购物网站
  • 公司做网站网站开发技术期中试题
  • 江苏外贸网站建设推广企业网站规划原则
  • 做网站的花费wordpress相关文章推荐
  • 手机网站分类菜单辽宁大连最新消息今天
  • 什么网站动物和人做的吗自助网站建设推广优化策略
  • 网站维护需要多长时间做付费网站
  • 青岛网站开发公司电话做cpa网站
  • 计算机应用技术与php网站开发erp是什么办公软件
  • 兴义市住房和城乡建设网站月销售网页制作指南
  • oppo官方网站网站频道规划
  • 酒店建设网站的意义wordpress调用阅读量
  • 手把手教你建网站公司手册制作网站
  • 网站友情链接的作用网站建设的基本思路
  • 怎么制作网站发布展示型企业网站设计方案
  • 做写字楼租赁用什么网站好织梦网站手机版端设置
  • 高端网站建设推荐万维科技高中信息技术课网站怎么做
  • 做网站用虚拟主机好不好wordpress文章显示时间
  • 搜索引擎推广有哪些平台百度网络推广优化
  • 江都建设总部网站scrm服务商
  • 网站建设次年续费合同图书网站建设策划书
  • 金融类网站模板网站建设佰首选金手指三十
  • 用织梦系统怎么做网站中国移动网上营业厅官网
  • it网站开发网站免费观看永久视频下载
  • 免费个人网站建设哪里好江苏省建设厅官网网站首页
  • 网站外链接自己可以怎么做的四川建设人才网官网证书查询
  • 西宁网站建设王道下拉惠简单的网页制作模板
  • 为什么做网站越早越好网站精美排版代码
  • 购物网站哪个质量好接软件开发项目的平台