Я пытаюсь обнаружить утечку памяти, и я использую макрос _CRTDBG_MAP_ALLOC для определения места утечки. Так я определяю MACRO как следующее:_CRTDBG_MAP_ALLOC, не отображающее имя файла
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
В моем коде, у меня есть:
UINT SomeFunThread(LPVOID pParam)
{
_CrtMemState crtMemStateStart;
_CrtMemState crtMemStateFinish;
_CrtMemCheckpoint(&crtMemStateStart);
// My suspisious code
_CrtMemCheckpoint(&crtMemStateFinish);
int nDifference(0);
_CrtMemState crtMemStateDifference;
nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish);
if(nDifference > 0)
_CrtDumpMemoryLeaks();
return 0;
}
(Благодаря Tushar Jadhav: Memory consumption increases quickly, then drops very slowly; memory leak?)
Но выход показывает что-то вроде:
Detected memory leaks!
Dumping objects ->
{124058} normal block at 0x0000000031DED080, 24 bytes long.
Data: < 0 ` $ > C8 30 F7 EF FE 07 00 00 60 D2 24 1D 00 00 00 00
вместо примерно такого:
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Как я могу показать это имя файла и местонахождение утечки?
код, который выделяет только не был скомпилирован с #defines в результате. Может быть размещен в библиотеке, может быть в DLL, как в предварительно созданных специализациях классов шаблонов C++. Или DLL, которая содержит код, была выгружена до того, как был создан отчет об утечке. –
@ HansPassant Итак, вы говорите, что это не мой «подозрительный код», который просачивается; это был код/bianraies/dlls, вызываемый внутри «подозрительного кода»? –
Я бы сказал, что это код, которого вы не нашли, может быть где угодно. Обычная проблема с утечками, не так ли? Если вы можете получить число между {фигурными скобками} для повторения, тогда установите _crtBreakAlloc на это число. –