_CrtSetAllocHook никогда не показывает имя файла / номер строки - PullRequest
2 голосов
/ 14 ноября 2010

Я внедряю трекер памяти в свое приложение, чтобы в дальнейшем, если бы у меня были утечки памяти, я мог бы включить этого маленького парня, чтобы найти его.передал имя файла или номер строки.Есть ли какой-либо флаг, который я должен установить, используя _CrtSetDbgFlag, или команду препроцессора?

После того, как я запустил эту вещь (голые кости), она показала 26 выделений, которые не были очищены, и я уверен, что это не я, но понятия не имею, где они произошли.заранее!

1 Ответ

3 голосов
/ 14 ноября 2010

Из заголовочного файла <crtdbg.h>:

#ifdef  _CRTDBG_MAP_ALLOC
#define   malloc(s)             _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
// etc...
#endif

Обратите внимание, что переопределение теперь вызывает другую версию malloc, у которой есть номер файла и строки, которые вы ищете.Понятно, что для этого вам нужно #define _CRTDBG_MAP_ALLOC и #include crtdb.h.Лучше всего это сделать в вашем предварительно скомпилированном заголовочном файле, чтобы вы могли быть уверены, что весь ваш код будет скомпилирован с этими макросами.

Это еще не гарантирует, что вы получите эту информацию.Ваш проект может использовать .lib, который был скомпилирован без него.Другим режимом сбоя являются библиотеки DLL, которые могут быть выгружены всего за до , когда вы создадите отчет об утечке.Информация о файле и строке для этой DLL также будет выгружена.

Существует запасной вариант для диагностики подобных проблем.В отчете об утечке есть строка для утечки, которая начинается с номера блока, показанного в начале внутри фигурных скобок.Пока этот номер блока стабилен между запусками, вы можете принудительно прервать отладчик при выполнении выделения.Поместите этот код в ваш метод main или в любую точку кода, которая выполняется раньше:

 _crtBreakAlloc = 42;   // Change the number
...