dec*_*tle 0 c++ exception-handling exception raii stack-unwinding
TIL,我对RAII和堆栈展开的'交织'(缺乏一个更好的词)的概念是完全(如果不是完全)错误.我的理解是使用RAII,防止任何/所有资源泄漏 - 甚至是可能由未处理的异常引起的泄漏.
然而,编写这个测试程序并随后磕磕绊绊地阅读本文/文档,让我意识到堆栈展开只会导致启用RAII的资源释放为try块中的自动启动,而不是自动在例如外部/其他范围内.
我对这个(新的)理解是否正确?或者还有其他细微差别我尚未掌握?那里的任何大师都想要进入?任何好的写作/分析/解释(堆栈展开)的指针都会有所帮助/赞赏......
从C++ 03标准,§15.3/ 9:
如果在程序中找不到匹配的处理程序,则调用函数terminate(); 在调用terminate()之前是否展开堆栈是实现定义的(15.5.1).
§15.5.1/ 1:
在下列情况下,必须放弃异常处理以获得不那么微妙的错误处理技术:...当异常处理机制找不到抛出异常的处理程序时(15.3)...
§15.5.1/ 2:
在这种情况下,
void terminate();
被称为(18.6.3).在没有找到匹配处理程序的情况下,无论堆栈是否在调用terminate()之前展开,它都是实现定义的.在所有其他情况下,在调用terminate()之前不应解开堆栈.基于确定展开过程最终将导致调用terminate(),不允许实现过早地完成堆栈展开.
| 归档时间: |
|
| 查看次数: |
1507 次 |
| 最近记录: |