Вопрос

Я пытаюсь использовать обнаружение утечек памяти 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 мне поможет.Если это не сработает, я могу в конечном итоге переопределить операторы нового и удаления, но я действительно хочу получить информацию о распределении с именем файла и номером строки (скрещивает пальцы).

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top