2010-08-16 55 views
2

我面臨的問題是我的應用程序全局變量析構函數沒有被調用。這似乎只在我的應用程序成功連接到Oracle數據庫(使用OCI)時發生。全局變量析構函數未調用,從哪裏開始?

我在CRT中放置了一些斷點,看起來DllMain(或__DllMainCRTStartup)沒有用DLL_PROCESS_DETACH調用,因此沒有調用atexit(),這就解釋了爲什麼我的析構函數沒有被調用。 我不知道爲什麼會發生這種情況。

我意識到這可能不足以說明原因,但我的問題是:尋找這個問題的原因會是一個好的開始?

這是我已經嘗試過的事情的清單:

  • 搜索網的解決方案
  • 連接調試器,使本地的例外,看看有沒有隱藏的崩潰,我有時會去得到一個異常.Net框架,但應用程序似乎繼續。
  • 嘗試在一個小應用程序重現,沒有成功

回答

2

我遇到這種情況最常見的情況是程序崩潰。在某些情況下,崩潰可能會從最終用戶的角度靜靜地發生。我將一個調試器附加到程序中,將其設置爲打破所有本地異常並運行該方案。

+0

已經嘗試過,但感謝您的建議 – eli 2010-08-16 14:00:30

0

調用exit API通常意味着應用程序退出而不調用析構函數。我不確定VC是否在這種情況下。

另請嘗試避免使用全局對象。這是因爲你幾乎無法控制構造函數和析構函數被調用的時間和順序。而是將對象轉換爲指針,並使用適當的DllMain鉤子初始化並銷燬指針。由於DllMain是一個操作系統結構,而不是語言結構,因此在正常退出的情況下,它應該證明更可靠。