构造函数-析构函数的调用时机 VS 异常

一般地

  • 这两个函数==由编译器保证调用==
    • 构造函数在创建对象时调用
    • 析构函数在对象离开作用域时调用
      • 即使在作用域内发生异常(throw),对象的析构函数仍然能确保调用
  • RAII思想的重要基础

CPP异常机制

  • try -> throw() -> catch()
    • 开发人员可以手动使用throw来触发异常
    • 某些std库函数也具有throw异常的功能
      • 总之异常的throw是先判断条件是否满足
      • 若不满足则主动调用throw抛出异常
        • 是无法处理某些硬件级exception的
    • 程序将从throw点返回到最近的try -> catch语句块的catch中
      • 猜测这里是由编译器做的:跳转到最近的catch,且将中间待释放的对象的析构函数在这里进行调用/【或者返回到catch之后再调用?】
    • 栈解退的过程,编译器也会在适当时机调用【静态编译出的结果;程序编译完成后,其在各种分支下应该调用的函数链就已经是确定的了(除了虚函数还有某些类似机制)】析构函数

实验验证

  • 是的,创建对象时,会在适当位置调用相应的构造函数,而在离开作用域时会调用析构函数

构造函数-析构函数的调用时机 VS 异常
http://example.com/2024/08/25/CPP/构造函数-析构函数的调用时机 vs 异常/
作者
Cyokeo
发布于
2024年8月25日
许可协议