这可能会更好地指向Microsoft的支持,但想知道是否有人对此有何看法。为什么我的DLL在使用MFC作为Visual Studio 2010中的DLL时在MFC SDI程序中使用时泄漏?
我创建了一个简单的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的默认设置在为MainFrm.h我#包括使一个通用的MFC SDI(单文档界面)的应用程序“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?
Google“静态初始化命令失败”。 –
谢谢。我注意到,在我发布这个消息之前,将所有wstrings改为wchar_t []解决了这个问题,但是不知道为什么。它似乎与MFC静态/ DLL绑定的事实仍然让我感到奇怪。 – bsruth