这两天在设计一个项目,独立了几个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。