2010-11-25 21 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異常,如訪問衝突,這是內存損壞造成的(並因此編程狀態被打開以開始)。