Visual Studio _CrtDumpMemoryLeaks всегда пропускает дамп объекта - PullRequest
3 голосов
/ 08 января 2009

Я пытаюсь использовать обнаружение утечки памяти CRT, но продолжаю получать следующее сообщение в Microsoft Visual Studio: «Обнаружены утечки памяти - пропуск дампа объекта». Я никогда не смогу заставить это сделать и объектный дамп.

Я следовал инструкциям в статье Microsoft об обнаружении утечек памяти (http://msdn.microsoft.com/en-us/library/e5ewb1h3(VS.80).aspx), но не повезло.

В моем stdafx.h (перестроен весь проект):

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

В точке входа моей заявки:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Я также надеюсь, что он отобразит имя файла и номер строки в объявленном Microsoft формате:

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.

Хотя мне НИКОГДА не удавалось даже получить дамп объекта, но я заметил, что другие люди говорят, что видят что-то подобное (даже с определенным _CRTDBG_MAP_ALLOC):

Detected memory leaks!
Dumping objects ->
{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.

На самом деле я не хочу тратить время на переопределение операторов new и delete, поэтому я надеялся, что отладка CRT поможет мне. Если это не сработает, я могу переопределить операторы new и delete, но я действительно хочу получить информацию о распределении с именем файла и номером строки (пересекает пальцы).

Спасибо, Кирил

Ответы [ 3 ]

2 голосов
/ 22 марта 2011

Я только что использовал Визуальный детектор утечек после получения большого дампа утечек объектов без имен файлов / номеров строк с использованием подхода _CrtDumpMemoryLeaks. VLD работал как рекламируется (это бесплатно), и я очень доволен этим.

1 голос
/ 08 января 2009

Причина, по которой имя файла и строка печатаются, состоит в том, что выделение было выполнено с использованием макроса new, который передает __FILE__ и __LINE__. Если вы не хотите нажимать new, вы не будете передавать __FILE__ и __LINE__ на ЭЛТ, и он не сможет распечатать это. Здесь нет большой магии, действительно.

1 голос
/ 08 января 2009

У меня его нет на моей машине, но когда вы устанавливаете MSVC, у вас есть возможность установить (большую часть) исходный код для библиотеки времени выполнения C (т.е. для MSVCRTxx.xxx). Если вы посмотрите в этом исходном коде «пропуск дампа объекта», вы сможете выяснить, почему пропускается дамп объекта.

...