构造函数-析构函数的调用时机 VS 异常
一般地
- 这两个函数==由编译器保证调用==
- 构造函数在创建对象时调用
- 析构函数在对象离开作用域时调用
- 即使在作用域内发生异常(throw),对象的析构函数仍然能确保调用
- RAII思想的重要基础
CPP异常机制
- try -> throw() -> catch()
- 开发人员可以手动使用throw来触发异常
- 某些std库函数也具有throw异常的功能
- 总之异常的throw是先判断条件是否满足
- 若不满足则主动调用throw抛出异常
- 是无法处理某些硬件级exception的
- 程序将从throw点返回到最近的try -> catch语句块的catch中
- 猜测这里是由编译器做的:跳转到最近的catch,且将中间待释放的对象的析构函数在这里进行调用/【或者返回到catch之后再调用?】
- 栈解退的过程,编译器也会在适当时机调用【静态编译出的结果;程序编译完成后,其在各种分支下应该调用的函数链就已经是确定的了(除了虚函数还有某些类似机制)】析构函数
实验验证
- 是的,创建对象时,会在适当位置调用相应的构造函数,而在离开作用域时会调用析构函数
- compiler explorer
![[构造-析构调用.png]]
- compiler explorer
构造函数-析构函数的调用时机 VS 异常
http://example.com/2024/08/25/CPP/构造函数-析构函数的调用时机 vs 异常/