這兩天在設計一個項目,獨立了幾個DLL模塊。昨天勉強把前段工做作完了,須要的DLL也都掛進了EXE文件之中,暗自高興了一把。不過晚上在看的時候,發現VS2005輸出窗口提示有內存泄露:php
a CDynLinkLibrary object at...測試
內心總以爲不爽 Lspa
今天去Google搜索了一下,第一篇是:當您使用多個MFCDLL 報告內存泄漏翻譯
http://support.microsoft.com/kb/167929/zh-cn設計
因爲是「注意:這篇文章是由無人工介入的微軟自動的機器翻譯軟件翻譯完成。」因此沒有怎麼仔細看。code
後來經過註釋代碼發現,緣由多是由於一個DLL內部使用另外一個DLL中的導出類形成的。因而將這兩個DLL合併到一個DLL中,再連接到EXE中測試,果真沒了J對象
可是我又不想將這兩個DLL合併到一塊兒,由於另外一個DLL是「通用」的。我在想,這倒底是什麼緣由呢?一輩子氣,算了,直接搞個Win32 DLL,也不使用什麼MFC DLL。blog
創建好Win32 DLL以後,拷貝之前DLL中的類到項目,加進去編譯。編譯器卻提示說:什麼MFC工程須要MFC DLL支持。再一想,原來是由於之前的MFC DLL嚮導會默認包含stdafx.h。純Win32 DLL不須要這個。忽然之間,又想到了一個問題:那篇自動翻譯的提到了什麼UNICODE與ANSI。內存
原文以下:get
與 ANSI (MFC40d.DLL) 的 MFC 版本生成 MFC 應用程序調用 MFC USRDLL, 它與 UNICODE (MFC40Ud.DLL) 的 MFC 版本生成。 MFC 版本使用相同 C 運行時庫 (CRT) DLL, MSVCR40d.DLL。 因爲 MFC USRDLLs 是框 " 黑色 - ", 應從 ANSI MFC 應用程序調用 UNICODE MFC USRDLL 沒有問題。
可是, 以來 (MFC40ud.DLL) UNICODE 和 ANSI (MFC40d.DLL) MFC DLL 都使用同一 CRTDLL, MFC USRDLL 中分配全部對象上報告假內存泄漏。 這是由於 MFC 依靠 CRTDLL 來分配和跟蹤全部內存。 它並不分開來自不一樣版本的 MFC 內存分配。 當 MFC DLL 之一卸載, 它調用 CRT 進行內存轉儲, 假定全部處於堆是內存泄漏。 可是, 此假定是錯誤由於有兩多份 MFC 內存中。
這有問題麼?立馬打開全部的DLL項目,
看到突顯的這塊了麼,個人項目中有的DLL使用的是Unicode字符集,有的使用的是多字節字符集。而後將全部的DLL使用多字節字符集進行編譯,生成EXE。一看,沒了。看來,項目中使用的DLL字符集要保持一致,怪不得有些庫會編譯出好多版原本,而後在它的包含文件,根據預處理的定義加載「正確」的DLL。