_CrtDumpMemoryLeaks усеченный вывод? - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь использовать возможности Visual Studio для обнаружения утечек памяти, но я получаю усеченный вывод, например:

Dumping objects ->
{174} normal block at 0x0099ADB8, 48 bytes long.
 Data: <h:\najnovije\tru> 68 3A 5C 6E 61 6A 6E 6F 76 69 6A 65 5C 74 72 75 
{170} normal block at 0x0099AD58, 32 bytes long.
 Data: <h:\najnovije\tru> 68 3A 5C 6E 61 6A 6E 6F 76 69 6A 65 5C 74 72 75 
Object dump complete.

Что я делаю неправильно?Я добавил

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

в начало моего кода.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 января 2011

Если вы хотите, чтобы исходный файл + номер строки того места, где выделение находилось в плоскости, тогда вы должны использовать функции отладки CRT для выделения вместо обычного malloc / new.

Если вы используете 'new', вы можете сделать это: #define new DEBUG_NEW

Или для malloc, используйте _malloc_dbg вместо malloc. Просто прочитайте документы MSDN для _malloc_dbg, и вы увидите там различные элементы. Большинство макросов, которые используют это, будут использовать __FILE__ и __LINE__ здесь.

2 голосов
/ 12 января 2011

К сожалению, Microsoft Visual C ++ не сообщает вам точное место утечки.И даже если бы это было так, это, вероятно, было бы где-то в некоторой общей подпрограмме вашего приложения (например, AllocateString) или в операторе new.

В вашем выводе h: \ najnovije \ tru не является [усеченным] именемисходного файла, который вызвал утечку, но это первые 16 байтов блока данных, который не был освобожден.

Попробуйте найти места, где вы храните имя файла в вашем приложении.Это, вероятно, укажет вам на фактическую утечку.

1 голос
/ 15 января 2011

Этот вывод не урезан.Он предназначен для использования по-другому.

Попробуйте дать более глубокое наблюдение за вашей программой.Visual Studio всегда (точнее, ~ 99% времени) дает одинаковые утечки 0x0099ADB8 и 0x0099AD58, если вы используете одни и те же шаги теста.

Теперь вам нужно настроить точки останова данных, которые ломаются наизменения этих двух адресов.Разрыв в начале вашей программы, выберите Отладка-> Новая точка останова-> Новая точка останова данных, введите адрес.В вашем случае вам нужно создать два из них: один для 0x0099ADB8, а другой для 0x0099AD58.Затем, в конце концов, вы остановитесь на коде, который создает экземпляр этого блока памяти, что дает вам точную точку, из которой происходит утечка.

Могут быть случаи, когда вы каждый раз получаете разные адреса утечки.В этом случае лучше использовать вместо этого gflags и WinDBG, чтобы у вас была возможность изменить содержимое памяти и начать с этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...