C++ 检测C+中的内存泄漏+;/窗户

C++ 检测C+中的内存泄漏+;/窗户,c++,windows,com,memory-leaks,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 <st

出于调试目的,在编写应用程序时,我要做的第一件事是将以下内容放入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
重新定义新的操作员以提供泄漏信息是一个有用的工具。但是CoTaskMemAlloc和CoTaskMemFree呢?如何使用这些工具检测泄漏

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


谢谢

摆脱手动内存管理,您将摆脱泄漏。接受RAII,永远不要使用资源,除非它被包装在一个处理程序中,该处理程序的唯一目的就是包装该资源


我想我已经多年没有内存泄漏(或崩溃,FTM)。但在过去十年中,我写
delete
的次数不到五六次

还有应用程序验证程序。它还可以跟踪一大堆其他问题,除了诸如忘记释放win32对象(如句柄等)的漏洞之外

MSDN链接是:

摘自一个类似的问题

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

您不能因为
malloc
/
free
不能帮助您检测泄漏的相同原因。您需要适当地包裹它们,以帮助您进行泄漏检测

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


您是否碰巧访问过这个问题:的用法

-非常容易使用,而且内置版本的应用程序没有开销。

这几乎没有什么帮助comment@freefallr怎么会“几乎没有帮助”?除非您有非常特殊的需求阻止您使用RAII(您从未提到过,因此有人假设您不知道该技术),否则这确实有助于您防止内存泄漏,这大概就是检测内存泄漏的目的?当然它不会直接回答你的问题,但它确实提供了一种更好的做事方式,是吗?@freefallr:所以指出一种防止骨折的方法并不能很好地回答一个关于如何从反复骨折中恢复的问题?@sbi:不同的是,你可以通过避免再次骨折而不骨折。重构代码以使用RAII将修复内存泄漏问题,这无疑是绝对值得的。领养拉伊。尽管如此,您仍然可以得到内存和资源泄漏(出于各种原因)。然后,您可以获得一个工具,如Deleaker:。但我通常做的是使用detours库钩住相关函数:并自己跟踪资源。我并不是说我想使用这些调用检测泄漏,如果我的声明不清楚,很抱歉。我只是想检测使用CoTask调用分配的内存可能泄漏。我的程序从网络源接收媒体帧。这些媒体帧必须传递给第三方(MainConcept)提供的DirectShow筛选器。因此,(i)过滤器是一个黑匣子,(ii)我认为过滤器没有像应该的那样释放媒体帧,(iii)Directshow过滤器必须接收通过“COM感知”CoTaskMemAlloc分配的媒体帧。从本质上讲,虽然我可以分配帧,但要取消分配还是要由第三方组件来完成。我想证明第三方组件没有正确地解除分配。这是一个糟糕的设计。好的设计的一条经验法则是谁分配、释放资源。由于分配在不同的图书馆里,你的生活就不那么美好了。我会试图证明第三方库实际上释放了所有帧,启动WinDbg,在
CoTaskMemFree
上设置一个断点,然后等待,看看当我在第三方中时是否有断点被击中。v1.9在VS10上对我不起作用,v2.2.3从这里开始:不过起了作用。
#ifdef _DEBUG
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
//_CrtSetBreakAlloc( 670 );
#endif