1、catch语句的参数有三种方式:by pointer,by value,by reference。

2、首先考虑,by pointer。这意味着抛出端必须抛出一个对象的地址。那么问题来了:

  如果这个对象分配在栈上,离开作用域,对象销毁,catch语句中指针指向一堆垃圾。

  因此,这个对象不能分配在栈上,也就是说,离开了作用域对象仍然存在,没有销毁。那就只能是static对象,或者是heap对象。那么问题又来了,在catch语句的客户端,客户到底要不要执行delete呢?客户不知道这个对象是static还是heap对象。如果执行delete,而抛出端的对象是static,对不是在heap上分配的对象,执行delete,导致未定义行为。如果不执行delete,而抛出端的对象是heap对象,导致资源泄漏。因此,这种方式不可行。

  另外,这与语言本身的惯例有矛盾。因为标准的异常bad_alloc,bad_cast,bad_typeid,bad_exception都是抛出对象,而不是对象指针。

  因此,catch语句使用by pointer不可行。

3、考虑by value。我们知道从抛出异常到catch语句,之间必定有一个临时对象。如果catch语句是by value,导致临时对象再一次copy构造,而且,如果抛出子类对象,catch父类对象,将造成对象切割。在catch语句中,失去多态行为。

  因此,catch语句使用by value,一是效率差,二是造成对象切割。不可行。

4、使用by reference很好地解决了上面的问题,只需要加上一个&。避开了对象是否删除的问题,减少了copy构造次数,避免了对象切割。因此,catch异常使用by reference。

【M13】以by reference 方式捕捉exceptions的更多相关文章

  1. ###《More Effective C++》- 异常

    More Effective C++ #@author: gr #@date: 2015-05-24 #@email: forgerui@gmail.com 九.利用destructors避免泄漏资源 ...

  2. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  3. More Effective C++ 35 条款

    一.基础议题(basics) 条款1:仔细区别 pointers 和 references(Distinguish between pointers and references) 一个基本的语法问题 ...

  4. c++interview

    出自:https://github.com/huihut/interview Github    |    Docsify 简体中文    |    English 关于 本仓库是面向 C/C++ 技 ...

  5. [C++]高效C/C ++编程tips

    Effective C++ 视C++ 为一个语言联邦(C.Object-Oriented C++.Template C++.STL) 宁可以编译器替换预处理器(尽量以const.enum.inline ...

  6. C#不能捕捉的异常,如AccessViolationException

    在.net的异常机制中,有部分严重的编程错误(系统的某些Corrupted State Exceptions异常)是默认不被用户使用常规的异常捕捉方式捕捉到的. 微软的这种设计方式,是让用户必须处理该 ...

  7. 特征创建:Reference Characteristic、Template

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. ASP.NET MVC下自定义错误页和展示错误页的几种方式

    在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...

  9. swift项目第五天:swift中storyBoard Reference搭建主界面

    一:StoryBoard Reference的介绍 StoryBoard Reference是Xcode7,iOS9出现的新功能 目的是让我们可以更好的使用storyboard来开发项目 在之前的开发 ...

随机推荐

  1. xcopy 复制了0个文件

    xcopy /Y "..\..\..\SolutionItems\zbmyuncore.db" "..\ZITaker" 复制zbmyuncore.db文件的时 ...

  2. Hibernate一对多和多对一关系详解 (转载)

    :双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side).在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列.     publ ...

  3. 一种基于Storm的可扩展即时数据处理架构思考

    问题引入 使用storm可以方便的构建一种集群式的数据框架,并通过定义topo来实现业务逻辑. 但使用topo存在一个缺点, topo的处理能力来自于其启动时设置的worker数目,在很多情况下,我们 ...

  4. bzoj3294

    感觉自己就是不怎么擅长计数的问题 设f[k,i,j]表示前k种颜色占据了i行j列的方案 g[k,i,j]表示第k种颜色占据了i行j列的方案,注意要减去并没占据满i行j列的情况 然后转移就很好写了 像这 ...

  5. java高并发,如何解决,什么方式解决

    之前我将高并发的解决方法误认为是线程或者是队列可以解决,因为高并发的时候是有很多用户在访问,导致出现系统数据不正确.丢失数据现象,所以想到 的是用队列解决,其实队列解决的方式也可以处理,比如我们在竞拍 ...

  6. Kernel 中的 GPIO 定义和控制

    最近要深一步用到GPIO口控制,写个博客记录下Kernel层的GPIO学习过程! 一.概念 General Purpose Input Output (通用输入/输出)简称为GPIO,或 总线扩展器. ...

  7. java中两种类型变量

    Java中有两种类型的变量,一种是对象类型,另一种是基础类型(primitive type). 对象类型普遍采用引用的方式,比如 List a = new ArrayList(); List b = ...

  8. Delphi word

    [转载]在Delphi中使用CreateOleObject方法 (2011-08-24 14:20:47) 转载▼ 标签: 转载   原文地址:在Delphi中使用CreateOleObject方法作 ...

  9. java.lang.ExceptionInInitializerError的原因(转)

    这个错误是说变量初始化出现问题,通常出现在静态变量尤其是单例模式.这种问题往往是初始化顺序不对造成的,下面举个简单的例子. import java.util.HashMap; import java. ...

  10. 房租管理小软件(六):通用功能包括时间,效验,MD5加密,XML 操作

    1.时间相关 public static DateTime getNow() { MyFZDataContext dataContext = MyFZDataContext.getDataContex ...