这可能更好地针对 Microsoft 支持,但想知道是否有人对为什么会发生这种情况有任何想法。
我创建了一个简单的 C++ DLL,如下所示:
//simpledll.h
class simpledll {
public:
__declspec(dllexport) simpledll();
__declspec(dllexport) ~simpledll();
}
//someheader.h
#include <string>
const std::string SomeString(L"I'm Leaking");
//simpledll.cpp
#include "simpledll.h"
#include "someheader.h"
//some code to generate memory leak debug messages
simpledll::simpledll(){ /*code to register for memory leak debug messages*/}
simpledll::~simpledll(){}
接下来,我使用 VS 2010 中的默认设置制作了一个通用的 MFC SDI(单文档界面)应用程序。在 MainFrm.h 中,我 #include "simpledll.h"并创建一个成员变量: simpledll mSimpleDLL;
这就是有趣的地方。如果我编译 DLL 和针对 v100 的 MFC 应用程序(都使用/MDd 开关),只需启动然后关闭应用程序就会产生内存泄漏。如果我将 MFC 应用程序中的“使用 MFC”设置更改为在静态库中使用 MFC,泄漏就会消失。然后,如果我重新编译面向 v90 的 DLL 并使用 MFC 的 DLL 版本重新编译 MFC 应用程序,则不会出现内存泄漏。将 DLL 切换为使用 v100,将 MFC 应用切换为使用 v90,并且没有内存泄漏。事实上,似乎产生内存泄漏的唯一组合是 DLL 和 MFC 应用程序都面向 v100,并且 MFC 应用程序使用 MFC 作为共享 DLL。我什至在 VS11 开发人员预览版中尝试过这个,当以 v110 为目标时,一切正常。
有没有人遇到过这个问题?它是否仅限于 VS2010 中的 SDI MFC 应用程序?什么可能导致这些泄漏?我假设它与在调用 SomeString 常量的析构函数之前终止的 DLL 有关,但为什么将 MFC 用作 DLL 会影响它?
最佳答案
我相信这只是一个初始化 SomeString 与调用 AfxEnableMemoryTracking() 的顺序的问题(如果我没记错的话)。事实上,内存泄漏可能发生在其他构建中,但 SomeString 可能在内存泄漏跟踪激活之前已分配,或者在检查发生之前已释放(不太可能,示例中没有明确说明)。
您可以尝试通过为 SomeString 分配一个新值来使另一个构建显示泄漏,并使用更长的字符串来确保完成新的内存分配。从 simpledll 的构造函数中进行。但首先,您必须将字符串声明移动到 simpledll.cpp 文件中,否则您会在每个包含 someHeader.h 的 .cpp 中获得一个新实例。
编辑:它不是 MFC 特有的,任何 DLL 都会发生这种情况,但是随着 MFC 自动启用内存泄漏检测,它在 MFC 应用程序中变得更加明显。
关于c++ - 为什么我的 DLL 在使用 MFC 作为 Visual Studio 2010 中的 DLL 的 MFC SDI 程序中使用它时会泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7587211/