是否在调用终止时调用自动对象的析构函数?

Nic*_*ton 2 c++ stack throw brainbench

当我们throw来自析构函数时会发生什么?我知道它会导致terminate()被调用,并且内存确实被释放并且析构函数被调用,但是,这是在调用之前还是之后 ?也许这里的问题是在堆栈展开时使用的问题.throwfoothrow

dir*_*tly 13

是从foo调用之前还是之后?

这就是发生的事情:

  • foo() 叫做
  • 在堆栈上创建a类型的对象A
  • 下一个声明抛出
  • 现在,a调用了dtor for ,这会抛出另一个异常
  • std::terminate 被调用 - 这只是放弃异常处理机制:

来自C++ 0x草案:

15.5.1 std :: terminate()函数

1在以下情况下,必须放弃异常处理以获得不太精细的错误处理技术:

[...] - 当使用异常退出堆栈展开(15.2)期间对象的销毁时,或

2在这种情况下,调用std :: terminate()(18.7.3).在没有找到匹配处理程序的情况下,无论堆栈是否在调用std :: terminate()之前展开,它都是实现定义的.在所有其他情况下,在调用std :: terminate()之前,不应解开堆栈.基于确定展开过程最终将导致对std :: terminate()的调用,不允许实现过早地完成堆栈展开.

注意:强调我的