Это может быть лучше направлено на поддержку 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(){}
Затем я делаю универсальное приложение MFC SDI (интерфейс с одним документом), используя настройки по умолчанию в VS 2010. В MainFrm.h я #include "simpledll.h" и создаю переменную-член: simpledll mSimpleDLL;
Вот где это становится интересным.Если я скомпилирую и библиотеку DLL, и приложение MFC, нацеленное на v100 (оба с использованием ключа / MDd), простой запуск, а затем закрытие приложения приводит к утечке памяти.Если я изменю настройку «Использование MFC» в приложении MFC на использование MFC в статической библиотеке, утечка исчезнет.Затем, если я перекомпилирую DLL, предназначенную для v90, и перекомпилирую приложение MFC, используя версию DLL MFC, никакой утечки памяти.Переключите DLL для использования v100 и приложение MFC для использования v90 и без утечки памяти.Фактически, единственная комбинация, которая, по-видимому, вызывает утечку памяти, - это когда и DLL, и целевое приложение MFC v100, и приложение MFC используют MFC в качестве общей DLL.Я даже пытался сделать это с предварительным просмотром разработчика VS11, и при настройке v110 все работало нормально.
Кто-нибудь сталкивался с этой проблемой?Это ограничено только приложением SDI MFC в VS2010?Что может быть причиной этих утечек?Я предполагаю, что это как-то связано с завершением работы DLL до вызова деструктора константы SomeString, но почему использование MFC в качестве DLL влияет на это?