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

3 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
Run Code Online (Sandbox Code Playgroud)

然后我将以下内容添加到程序的main()函数的开头:

#ifdef _DEBUG
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
//_CrtSetBreakAlloc( 670 );
#endif  
Run Code Online (Sandbox Code Playgroud)

重新定义新操作符以提供泄漏信息是一种有用的工具.但是CoTaskMemAlloc和CoTaskMemFree呢?如何使用这些来检测泄漏?

我正在编写使用COM和DirectShow的软件,并且需要知道如何跟踪使用CoTask分配导致的泄漏.

谢谢!

sbi*_*sbi 6

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

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

  • 这几乎不是一个有用的评论 (6认同)
  • 总的来说,我同意sbi.采用RAII.有了这个说你仍然可以获得内存和资源泄漏(出于各种原因).然后你可以得到像Deleaker这样的工具:http://www.deleaker.com/index.html.但通常我通常做的是使用绕行库挂钩有问题的函数:http://research.microsoft.com/en-us/projects/detours/并自己跟踪资源. (4认同)