检测C ++ / windows中的内存泄漏

时间:2010-08-14 10:07:47

标签: c++ windows com memory-leaks

出于调试目的,当我编写应用程序时,我要做的第一件事就是将以下内容放入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 个答案:

答案 0 :(得分:6)

摆脱手动内存管理,你将摆脱泄漏。拥抱RAII,永远不要使用资源,除非它包含在一个处理程序中,其唯一目的是包装该资源。

我认为多年来我没有内存泄漏(或崩溃,FTM)。但是在过去的十年里,我写了delete不到六次。

答案 1 :(得分:3)

Visual Leak Detector - 非常易于使用,并且内置版本的应用程序没有任何开销。

答案 2 :(得分:1)

还有应用程序验证程序。它可以跟踪一大堆其他问题,除了泄漏,比如你忘记释放win32对象的地方,如句柄等......

MSDN链接为:http://msdn.microsoft.com/en-us/library/ms220948(VS.80).aspx

取自Visual C++ - Memory Leak Detection

的类似问题

答案 3 :(得分:0)

  

但是CoTaskMemAlloc和CoTaskMemFree呢?如何使用这些来检测泄漏?

malloc / free无法帮助您检测泄漏的原因相同。您需要适当地包装它们以帮助您进行泄漏检测。

正如其他海报所说,如果您担心泄漏,那么请考虑到这一要求,开始设计您的应用程序。使用自定义分配器,您可以在其中管理/跟踪分配/解除分配。

您是否碰巧访问过此问题:CoTaskMemAlloc的用法?