CPP Exception

CPP Exception

已知
异常类/异常对象, CPP-runtime/编译器会维护一个副本copy
进入catch-handler时, 在try子句中, 编译器管理已构造局部对象(非指针), 进行析构
具体同如下DO

异常与构造函数
  • 抛出异常
    • 别人抛异常 => 我catch
    • 我基本不抛 => 否则, 擦屁股有哪些事 => DO
  • 捕获异常
    • 使用函数try语句块, try位于冒号之前, 将捕获的范围扩大到构造函数初始值列表(即构造函数正确姿势), 即初始化 => 对应被聚合对象的构造函数异常
    • catch-handler/catch子句做什么事情 => DO
  • DO
    • 已知, 即使不在try子句已经成功构造的成员对象(非指针, 有成员), CPP编译器会调用析构
    • 已知, 不会调用自己的析构
    • 问题是指针维护的资源比如堆, 句柄, 着色器, DB等依靠拷贝控制成员的东西, 且已经分配完成 => 资源泄露
    • 解决方式
      • 使用smart pointer 对象, 属于成员对象的析构
      • 此处, 必要时, 手动执行析构应有的动作
异常与析构函数
  • 抛出异常
    • 是UB, 任何析构该类对象时, 不捕获 => std::terminate(); 捕获 => 即自己吃自己的屎 => 有意义么
    • try子句中任何使用该类的局部对象, 编译器自动执行如上已知时, 进入任何一个catch-handler/catch子句, 即发生UB/terminate`, 否则无异常属于第一点情况
  • 捕获异常
    • 完全捕获所有异常, 且不要在catch-handler中继续抛出异常
    • 同时注意析构功能的完整性, 否则, 再次手动执行析构应有的动作
  • RAII简述
    • 不需要finally关键字, 一个动作的执行, 使用OO/OOP, 使用ctor/dtor
    • 对于异常发生, try子句范围/成员对象范围, CPP编译器有自动析构
    • 将指针用于smart-ptr<T>模板才能解决所有问题啊!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值