Я пишу класс-оболочку для вызова _CrtDumpMemoryLeaks () в приложении WPF.Я загружаю DLL на языке C в приложение WPF и хотел бы узнать, есть ли утечки памяти в DLL, так как WPF также работает как тестовое приложение для DLL.
class MemLeak
{
static int _CRTDBG_ALLOC_MEM_DF = 0x01;
static int _CRTDBG_LEAK_CHECK_DF = 0x20;
static int _CRTDBG_MODE_DEBUG = 0x2;
static int _CRTDBG_MODE_WNDW = 0x4;
static int _CRT_WARN = 0;
static int _CRT_ERROR = 1;
static int _CRT_ASSERT = 2;
[DllImportAttribute("msvcrtd.dll", EntryPoint = "_CrtDumpMemoryLeaks", SetLastError = true)]
static extern int _CrtDumpMemoryLeaks();
[DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetDbgFlag")]
static extern int _CrtSetDbgFlag(int newFlag);
[DllImportAttribute("msvcrtd.DLL", EntryPoint = "_CrtSetReportMode")]
static extern int _CrtSetReportMode(int reportType, int reportMode);
public static void StartMemLeakLogging()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG);
}
public static void StopMemLeakLogging()
{
_CrtSetReportMode(_CRT_ERROR | _CRT_WARN | _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW);
int i = _CrtDumpMemoryLeaks();
}
}
Я используюVisual Studio 2008 с пакетом обновления 1 (SP1) для Windows XP Professional с пакетом обновления 3 (SP3).Странно мне пришлось скачать файл msvcrtd.dll, потому что система не смогла его найти.После этого просто скопировал его в папку отладки и приложение начало работать.Однако я не вижу информации об утечке памяти в окне вывода во время отладки, даже если я намеренно выделил память и не освободил ее в коде DLL.
Кроме того, я не могу изменить исходный код DLL, иначепопытался бы поместить эти функции в исходный код DLL.Я пытался создать приложение MFC и вызывать функции DLL, приложение MFC обнаруживает утечки памяти и отображает в окне вывода, даже если я не вызываю _CrtDumpMemoryLeaks (), потому что я думаю, что MFC при отладке может вызывать эту функцию изнутри, но не работает сТестовое приложение WPF.