我有一個用C++ Builder(2006)編寫的DLL,我從.NET應用程序調用DLL中的單個函數。從.NET使用VCL(C++ Builder)DLL時發生資源泄露
問題是,當我關閉.NET應用程序(並將DLL從它分離)時,我得到一個CodeGuard錯誤,指出它檢測到資源泄漏(並且我看到了CodeGuard日誌文件中的泄漏)。在釋放DLL時,我還會在Visual Studio中看到LoaderLock MDA(可能出於同樣的原因?)。
現在,我99%肯定我釋放了我在DLL函數中使用的所有內存。實際上,我試圖用一個完全沒有任何內容的完全相同的函數構建一個虛擬DLL,並且當從.NET應用程序中卸載DLL時仍然會發生資源泄漏。
我現在唯一懷疑的是,我正在使用內置於DLL中的VCL。是否有一些未初始化函數需要從DLL中分離時顯式調用?可能會發生什麼?
p.s. CodeGuard日誌文件中給出的調用堆棧的內存地址似乎遠遠超出我在Map文件中看到的任何內容。
感謝您的迴應,但我沒有使用任何線程局部變量。我擔心這可能會在Borland的RTL中更深一層。 – 2010-01-20 19:35:56
@Dmitry:但是,VCL確實使用線程本地存儲。所以,即使你沒有明確地使用它們,你的DLL可能也有它們。 – 2010-01-20 20:07:04
嗯,我試着實現你給出的代碼片段,但是我的TlsIndex(這是VCL中的一個全局變量)似乎總是-1,除非我在看錯誤的東西。 – 2010-01-20 20:39:55