обнаружение утечки памяти - PullRequest
2 голосов
/ 23 сентября 2010

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

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

и в конце основного я набираю:

_CrtDumpMemoryLeaks(); 

, когда я делаю все этоЯ получаю утечки памяти (что внутри них), но не места, где были выделены ресурсы. Можете ли вы помочь мне с командой, которая показывает, где были выделены места, спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 23 сентября 2010

Почему бы не использовать утилиту UMDH , которая поставляется с бесплатным пакетом Средства отладки для Windows от Microsoft?При условии, что ваши символы отладки настроены правильно, это даст вам фактические стеки вызовов распределений.

ПРИМЕЧАНИЕ. Если вы используете COM и BSTR, убедитесь, что вы установили OANOCACHE переменная окружения до 1.Если вы этого не сделаете, OLEAUT32.DLL будет кешировать BSTR выделения, и они будут отображаться как ложные срабатывания в вашем выводе UMDH.

1 голос
/ 13 июля 2012

Вы должны использовать _CRTDBG_MAP_ALLOC, а не _CRTDBG_MAPALLOC. Проблема на странице MSDN, где у них была опечатка, и они говорят об обоих флагах, но только первый из них хорош. Если вы хотите, вы можете проверить crt / crtdbg.h и увидите, что он использует только _CRTDBG_MAP_ALLOC.

Страница MSDN с опечаткой: http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=VS.80%29.aspx

0 голосов
/ 23 сентября 2010

Вы не можете из коробки. CrtDumpMemoryLeaks только сообщает вам, есть ли утечки памяти, а не где утечка памяти. ЭЛТ не предоставляет такой возможности.

Есть несколько способов сделать что-то подобное. Одним из способов будет использование такого инструмента, как Valgrind, который обрабатывает все приложение и запускает приложение на виртуальной машине. Valgrind значительно замедляет работу приложения, но делает возможным такой анализ. У CRT нет такой роскоши, как запускать вещи на виртуальной машине, поэтому он не может предоставить такую ​​информацию.

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

О, еще одна вещь - если вы правильно используете память в C ++, вам никогда не придется беспокоиться об утечках памяти, потому что вы не должны delete загружать память вручную. Попробуйте обернуть любые вызовы в new, используя вместо этого различные типы интеллектуальных указателей.

...