【问题标题】:detecting memory leaks in C++ / windows检测 C++/Windows 中的内存泄漏
【发布时间】:2011-03-29 19:29:23
【问题描述】:

出于调试目的,当我编写应用程序时,我要做的第一件事是将以下内容放入 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 分配引起的泄漏。

谢谢!

【问题讨论】:

    标签: c++ windows com memory-leaks


    【解决方案1】:

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

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

    【讨论】:

    • 这不是一个有用的评论
    • @freefallr 它是如何“几乎没有帮助”的?除非您有非常特殊的需要阻止您使用 RAII(您从未提到过,因此假设您不知道该技术),否则这确实可以帮助您防止内存泄漏,这可能是检测它们的重点?当然它不能直接回答你的问题,但它确实提供了一种更好的做事方式,不是吗?
    • @freefallr:所以指出一种防止你骨折的方法并不是回答关于如何从反复骨折中恢复的问题?
    • @sbi:不同之处在于,您可以通过避免重新折断骨头来解开骨头。重构您的代码以使用 RAII 将解决您的内存泄漏问题,这无疑是绝对值得的。
    • 总的来说,我在这里同意 sbi。采用 RAII。话虽如此,您仍然可以得到内存和资源泄漏(出于各种原因)。然后你可以得到一个像 Deleaker 这样的工具:deleaker.com/index.html。但大多数情况下,我通常会使用 detours 库:research.microsoft.com/en-us/projects/detours 连接到有问题的函数并自己跟踪资源。
    【解决方案2】:

    Visual Leak Detector - 非常易于使用,并且应用内置发布没有任何开销。

    【讨论】:

    • v1.9 在 VS10 上不适用于我,v2.2.3 从这里开始:vld.codeplex.com 工作得很好。
    【解决方案3】:

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

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

    取自Visual C++ - Memory Leak Detection的类似问题

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 我并不是说我想使用这些调用来检测泄漏,如果我的陈述不清楚,很抱歉。我的意思是我想检测可能使用 CoTask 调用分配的内存泄漏。
      • 我的程序从网络源接收媒体帧。这些媒体帧必须传递给由第 3 方 (MainConcept) 提供的 DirectShow 过滤器。因此,(i) 过滤器是一个黑盒子,并且 (ii) 我相信过滤器不会像应有的那样重新分配媒体帧,并且 (iii) Directshow 过滤器必须接收通过“COM 感知”CoTaskMemAlloc 分配的媒体帧。本质上,虽然我可以分配帧,但要解除分配取决于第 3 方组件。我希望能够证明 3rd 方组件没有正确释放。
      • 这是糟糕的设计。良好设计的经验法则是分配、释放资源的人。由于释放是在不同的库中,因此您的生活并不完全是玫瑰花坛。我会尝试证明第 3 方库实际上释放了所有帧,启动 WinDbg,在 CoTaskMemFree 处设置断点,然后等待查看是否在我在第三方内部时遇到断点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2021-09-01
      • 2011-02-18
      • 2010-09-21
      • 2013-04-16
      • 2012-07-16
      相关资源
      最近更新 更多