обнаружение утечек памяти в C ++ / windows - PullRequest
3 голосов
/ 14 августа 2010

В целях отладки, когда я пишу приложение, первое, что я делаю, это помещаю в stdafx.h следующее:

// -- leak detection ----------------------------------------------------------
#ifdef _DEBUG   
// http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=VS.80).aspx
#define _CRTDBG_MAP_ALLOC   
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

Затем я добавляю следующее в начало функции main () программы:

#ifdef _DEBUG
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
//_CrtSetBreakAlloc( 670 );
#endif  

Переопределение нового оператора для предоставления информации об утечке является полезным инструментом. Но как насчет CoTaskMemAlloc и CoTaskMemFree? Как я могу обнаружить утечки, используя их?

Я пишу программное обеспечение, которое использует COM и DirectShow и должно знать, как отслеживать утечки, вызванные использованием CoTask.

спасибо!

Ответы [ 4 ]

6 голосов
/ 14 августа 2010

Избавьтесь от ручного управления памятью, и вы избавитесь от утечек. Примите RAII и никогда не используйте ресурс, если он не заключен в обработчик, единственная цель которого - обернуть этот ресурс

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

3 голосов
/ 14 августа 2010

Visual Leak Detector - довольно прост в использовании и не требует дополнительных затрат для приложения, встроенного в релиз.

1 голос
/ 14 августа 2010

Существует также верификатор приложения. Он может отслеживать целую кучу других проблем, кроме утечек, таких как места, где вы забыли освободить объекты win32, такие как дескрипторы и т.д ...

Ссылка MSDN: http://msdn.microsoft.com/en-us/library/ms220948(VS.80).aspx

Взято из аналогичного вопроса в Visual C ++ - обнаружение утечки памяти

0 голосов
/ 14 августа 2010

А как насчет CoTaskMemAlloc и CoTaskMemFree?Как я могу обнаружить утечки, используя их?

Вы не можете по той же причине, что malloc / free не помогает вам обнаружить утечки.Вам нужно обернуть их соответствующим образом, чтобы помочь вам в обнаружении утечек.

Как говорили другие авторы, если вас беспокоят утечки, начните разработку приложения с учетом этого требования.Используйте пользовательские распределители, где вы можете управлять / отслеживать распределения / освобождения.

Вы не посетили этот вопрос: Использование CoTaskMemAlloc?

...