我有一个用MS Visual C ++ 2005编写的应用程序。它在客户端计算机上失败。我无法重现失败;我要做的所有分析都是由应用程序创建的日志。在应用程序中,我有以下片段:
class EntranceLoggerForFunc
{
public:
EntranceLoggerForFunc()
{
WriteToLog("EntranceLoggerForFunc");
}
~EntranceLoggerForFunc()
{
WriteToLog("~EntranceLoggerForFunc");
}
}
void Func()
{
EntranceLoggerForFunc logger;
....
if (<some comdition>)
Func();
....
}
void Func2()
{
try
{
Func();
}
catch(...)
{
WriteToLog("Exception happened");
}
}
该应用程序使用键/ EHa进行编译(使用SEH例外启用C ++例外。
在日志中,我看到以下内容:
EntranceLoggerForFunc
EntranceLoggerForFunc
〜EntranceLoggerForFunc
发生异常
换句话说,在Func()内部的某个地方发生了异常。并被困在Func2()中。但是,为什么在堆栈展开期间仅调用了两个对象EntranceLoggerForFunc的一个析构函数?
现在,我只有以下版本:堆栈以某种方式损坏(很可能是由于导致异常的相同错误操作),这就是为什么析构函数之一不起作用的原因。
还有其他版本吗?
最佳答案
另一种可能性是WriteToLog
是在第4次调用时引发异常的方法。