我有一个用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次调用时引发异常的方法。

09-27 14:14