內存泄露:a CDynLinkLibrary object at...的解決

這兩天在設計一個項目,獨立了幾個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 DLLblog

創建好Win32 DLL以後,拷貝之前DLL中的類到項目,加進去編譯。編譯器卻提示說:什麼MFC工程須要MFC DLL支持。再一想,原來是由於之前的MFC DLL嚮導會默認包含stdafx.h。純Win32 DLL不須要這個。忽然之間,又想到了一個問題:那篇自動翻譯的提到了什麼UNICODEANSI內存

 

原文以下: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

相關文章
相關標籤/搜索