• 【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。

  • 相关阅读:
    一些python练习题
    爬取某房源网数据
    练习1:定义 is_Even 函数,传一 int 参数,判断是否是偶数,return True;不是,return False
    pycharm中tkinter 不显示窗口
    保护眼睛颜色的RGB数值
    Python study----------class的实例化
    HTML----------STUDY
    Python study----------字典 popitem()
    Python study----------Python搜索路径
    Python study----------第三方module-----chardet(识别编码)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3544953.html
Copyright © 2020-2023  润新知