Использование детектора утечек памяти - PullRequest
1 голос
/ 01 апреля 2010

Я нашел очень интересный детектор утечки памяти с помощью Visual C ++.

http://www.codeproject.com/KB/applications/visualleakdetector.aspx

Я пробую, но не могу заставить его работать, чтобы обнаружить код утечки памяти.

Я использую MS Visual Studio 2008. Любой шаг, который я пропустил?

#include "stdafx.h"
#include "vld.h"
#include <iostream>

void fun() {
    new int[1000];
}

int _tmain(int argc, _TCHAR* argv[])
{
    fun();
    std::cout << "lead?" << std::endl;
    getchar();
    return 0;
}

Вывод при запуске в режиме отладки:

...
...
'Test.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\msvcr80.dll', Symbols loaded.
'Test.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', Symbols loaded (source information stripped).
'Test.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll', Symbols loaded.
'Test.exe': Loaded 'C:\Program Files\Visual Leak Detector\bin\dbghelp.dll', Symbols loaded (source information stripped).
Visual Leak Detector Version 1.9d installed.
No memory leaks detected.
Visual Leak Detector is now exiting.
The program '[5468] Test.exe: Native' has exited with code 0 (0x0).

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

У меня также есть необнаруженные "утечки". Вот полная история.

Куча отладки VS2008 сообщала о множестве утечек при завершении, которые было трудно отследить (поскольку фактические распределения были в коде MFC без отслеживания стека). Я попробовал VLD 2.2, и он отлично работал, чтобы отследить 4 утечки (хотя на самом деле это не было проблемой, это было больше похоже на «всплески памяти», то есть на выделение «одиночных» объектов).

После исправления этих VLD теперь выдает сообщение "Утечки памяти не обнаружены", но VS2008 сообщает об куче отладки "Обнаружены утечки памяти!" затем выбрасывает сотни из них. Почти все они встречаются в vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ strcore.cpp (141).

Кажется, VLD не обнаруживает все утечки.

Использование: VLD 2.2, VS2008, MFC 9 с установленным Feature Pack.

Кстати, приведенное выше предположение о том, что выделение в этом примере оптимизировано, неверно, поскольку в отладочных сборках оптимизация не производится.

1 голос
/ 01 апреля 2010

Я предполагаю, что, поскольку new int[1000] ничего не назначено, компилятор оптимизировал код и удалил часть выделения памяти. (мое предположение!)

VC6 четко показывает это как утечку памяти.

Dumping objects ->
{69} normal block at 0x00345028, 4000 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.
0 голосов
/ 01 апреля 2010

Если я правильно помню, вы все равно получаете стандартный отчет об утечке памяти в Visual Studio при использовании VLD, и вы не получили его в этом случае, поэтому я согласен с aj, что распределение, вероятно, не происходит. Возможно, попытаться присвоить массив чему-то?

Вам не нужно ничего делать, кроме как устанавливать пути и включать vld.h в свой проект, чтобы заставить VLD работать.

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