_CrtSetBreakAlloc используя содержимое памяти, а не номер выделения - PullRequest
0 голосов
/ 23 января 2019

Я использую функцию _CrtSetBreakAlloc() для отслеживания утечек памяти в debugger сборках моего проекта MFC. ( Вот код из моего предыдущего вопроса.)

Эта техника работает до тех пор, пока Allocation order number остается прежним. Но во многих случаях это не так. Например, вот два отчета, которые я получаю сейчас:

Первый запуск:

Detected memory leaks!
Dumping objects ->
{222861} normal block at 0x000002BDF58347C0, 240 bytes long.
 Data: <C : \ P r o g r > 43 00 3A 00 5C 00 50 00 72 00 6F 00 67 00 72 00 
{222860} normal block at 0x000002BDEFBA52A0, 16 bytes long.
 Data: <                > 10 AF B7 EF BD 02 00 00 00 00 00 00 00 00 00 00 
{222859} normal block at 0x000002BDEFB7AF10, 40 bytes long.
 Data: < R       G      > A0 52 BA EF BD 02 00 00 C0 47 83 F5 BD 02 00 00 
Object dump complete.

Второй запуск:

Detected memory leaks!
Dumping objects ->
{222422} normal block at 0x00000123DDB67540, 224 bytes long.
 Data: <C : \ P r o g r > 43 00 3A 00 5C 00 50 00 72 00 6F 00 67 00 72 00 
{222419} normal block at 0x00000123DDBA9C50, 16 bytes long.
 Data: <    #           > 80 16 B7 DD 23 01 00 00 00 00 00 00 00 00 00 00 
{222418} normal block at 0x00000123DDB71680, 40 bytes long.
 Data: <P   #   @u  #   > 50 9C BA DD 23 01 00 00 40 75 B6 DD 23 01 00 00 
Object dump complete.

Так что мне интересно, есть ли функция или способ переписать _CrtSetBreakAlloc, чтобы он вызывал точку останова на содержимом памяти? Например, в моем случае, когда в память записывается строка Unicode-16 "C:\Progr", записанная в нее.

1 Ответ

0 голосов
/ 23 января 2019

Уже есть _CrtSetAllocHook.Но как это должно помочь?Данные устанавливаются ПОСЛЕ выделения.Поэтому никакой ловушки не произойдет, когда данные, которые вы хотите активировать, будут записаны в выделенную память.

Единственный способ, которым я вижу, - это использовать _CrtDoForAllClientObjects и осуществлять поиск по всем выделенным блокам.

...