2010-09-23 2 views
2

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

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

и в конце основной я печатаю:

_CrtDumpMemoryLeaks(); 

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

ответ

0

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

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

Другим способом было бы использовать более интеллектуальные отладчики, которые понимают путь распределения кучи и отслеживают каждое выделение для вас, как Aaron Klotz's documents in his answer.

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

+0

я работаю над окнами и окружающей среде я не могу использовать Valgrind (только в состоянии в Linux, если я не ошибаюсь). разве нет другой техники, чтобы узнать, где было выделено выделение? –

+0

@ Надав: Не так далеко, насколько мне известно. Ваш код бизнес-логики компилируется на нескольких платформах, верно? :) –

+0

он сообщает вам порядковый номер распределения, и вы можете использовать 'CrtSetBreakAlloc', чтобы разбить это распределение при следующем запуске приложения. Конечно, это работает только тогда, когда порядок распределения до тех пор, пока утечка не станет детерминированной. – tenfour

3

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

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

+0

PS убедитесь, что вы не используете LFH или сложно распределить ассигнования –

+0

+1. Интересно. Стыдно, что CRT не отслеживает подобные вещи по умолчанию. Исправьте мой ответ, чтобы указать на это. –

1

Вы должны использовать _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

Смежные вопросы