Nic*_*ton 2 c++ stack throw brainbench
当我们throw来自析构函数时会发生什么?我知道它会导致terminate()被调用,并且内存确实被释放并且析构函数被调用,但是,这是在调用之前还是之后 ?也许这里的问题是在堆栈展开时使用的问题.throwfoothrow
dir*_*tly 13
是从foo调用之前还是之后?
这就是发生的事情:
foo() 叫做a类型的对象Aa调用了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()的调用,不允许实现过早地完成堆栈展开.
注意:强调我的