博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【M13】以by reference 方式捕捉exceptions
阅读量:4550 次
发布时间:2019-06-08

本文共 799 字,大约阅读时间需要 2 分钟。

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。

转载于:https://www.cnblogs.com/nzbbody/p/3544953.html

你可能感兴趣的文章
2、文件夹
查看>>
Mac显示器不亮
查看>>
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)...
查看>>
Android Camera——拍照(转自http://vaero.blog.51cto.com/4350852/779942)
查看>>
Java Web项目移植
查看>>
【CF316G3】Good Substrings 后缀自动机
查看>>
【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
查看>>
linux 2.6 驱动笔记(一)
查看>>
SpringMVC与MyBatis整合方法
查看>>
获取当前系统运行目录
查看>>
多个tomcat实例运行的配置
查看>>
一种基于 Numpy 的 TF-IDF 实现报告
查看>>
wpf窗口阴影
查看>>
linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用...
查看>>
Centos 7升级内核
查看>>
Pandas 基本技巧
查看>>
hdu 1264
查看>>
hdu 1273不会的题
查看>>
(转)父子窗体的菜单合并及工具栏合并
查看>>
分页SQL
查看>>