2015-05-14 75 views
1

我在一個testlib.dll中使用SQLite3 3.8.8.2有一個導出的函數void DoDBOperation(),只是打開數據庫,然後關閉它。我寫了一個使用LoadLibararyEx()加載DLL的EXE,調用函數DoDBOperation()並最終使用FreeLibrary()卸載DLL。我在循環中做了10000次,導致內存泄漏。Windows - SQLite的活動關鍵部分

經過調查,我發現每次加載和卸載testlib.dll時,都會在調查堆後泄漏由WinDBG報告的48字節的關鍵段DS。 AppVerifier也報告庫正在被卸載並具有活動的關鍵部分。

如果我靜態鏈接DLL這種泄漏不會發生。我GOOGLE了很多,但沒有幫助。我試圖調試sqlite3.c,但沒有成功找到泄漏。

有人可以提供一些指針在這個問題上?任何幫助,將不勝感激。謝謝!!

回答

0

您應該在dll卸載時調用sqlite3_shutdown以正確清理它分配的資源(例如,在DLL_PROCESS_DETACH處理程序中)。

+0

謝謝,但它沒有幫助。即使我在DLL_PROCESS_DETACH處理程序中調用sqlite3_shutdown,臨界區仍然會出現在windbg中。我認爲CS是在進程地址空間中創建的,即使它在DLL中。所以一旦一個DLL被從進程中分離出來,DLL_PROCESS_DETACH處理程序被調用,但sqlite3_shutdown()仍然離開CS(1個或更多,我不知道)處於活動狀態。 – Abhay