堆叠解绕的原因失败 [英] Reasons for stack unwinding fail
本文介绍了堆叠解绕的原因失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在调试应用程序,遇到以下代码:
int Func()
{
try
{
CSingleLock aLock(& m_CriticalSection,TRUE);
{
//用户代码
}
}
catch(...)
{
//异常处理
}
return -1;
}
m_CriticalSection是CCricialSection。
我发现用户代码引发一个异常,使m_CriticalSection不释放。这意味着由于一些原因堆栈被破坏,因此解开失败。
我的问题是:
1)在什么不同的情况下堆叠展开可能失败? p>
2)可以抛出异常的不同可能性,使堆栈解开失败。
3)
感谢,
解决方案
您是否遇到程序异常终止?
我相信您的 CCriticalSection
对象将被发布 CSingleLock
的析构函数。析构函数总是被调用,因为这是堆栈上的一个对象。当用户代码抛出时, throw
和函数中的catch之间的所有堆栈都将被解开。
但是,你的用户代码中的某些其他对象或者甚至是 CSingleLock
析构函数都抛出了另一个异常同时。在这种情况下, m_CriticalSection
对象将无法正确释放,并且 std :: terminate
被调用, / p>
这里是一些示例。注意:我使用 std :: terminate
处理函数通知我的状态。您还可以使用 std :: uncaught_exception
来查看是否存在任何未捕获的异常。此此处