• 【M13】以by reference 方式捕捉exceptions


    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。

  • 相关阅读:
    React 高阶组件
    React Context(执行上下文)
    解决背景图片半透明(rgba)兼容性
    js基础复习---数组操作
    js基础复习---字符串操作
    escape()、encodeURI()、encodeURIComponent()区别详解(转)
    form data和request payload的区别(转)
    关于把时间搓转化为时间
    关于js 获取本地当前时间问题
    关于html 头部meta标签。
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3544953.html
Copyright © 2020-2023  润新知