2010-11-25 14 views
0

我有一个应用程序写在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(启用C++与SEH异常异常

在日志我看到以下:

EntranceLoggerForFunc EntranceLoggerForFunc 〜EntranceLoggerForFunc 异常发生

换句话说,一个异常的某处发生的函数功能()的内部;一d已被Func2()捕获。但是为什么堆栈展开期间只调用了两个对象EntranceLoggerForFunc的析构函数?

现在我只有以下版本:堆栈被损坏了(很可能是由于导致异常的错误操作),这就是为什么其中一个析构函数无法工作。

任何其他版本?

+0

你能发布一个可复制的例子来重现问题吗? – 2010-11-25 18:05:32

+0

顺便说一句 - 请注意始终接受你问的问题你最喜欢的答案。这就是StackOverflow的工作原理。您可以通过勾选左侧的绿色勾号将答案标记为“已接受”。 – Kos 2010-11-25 18:36:11

回答

2

另一种可能性是WriteToLog是在第4次调用时抛出异常的方法。

2

如果抛出的异常不是C++异常,而是Win32 SEH异常(例如,EXCEPTION_STACK_OVERFLOW或EXCEPTION_ACCESS_VIOLATION),那么异常处理的行为可能会变成...... err ..奇怪。

(这就是为什么EHA不再在Visual Studio 2010中的默认设置)

我的猜测是,实际的例外是一个SEH异常,如访问冲突,这是内存损坏造成的(并因此编程状态被打开以开始)。