【问题标题】:Memory leak detection内存泄漏检测
【发布时间】:2011-03-01 22:10:49
【问题描述】:

有人知道检测内存泄漏的通用算法吗?

【问题讨论】:

  • 用什么语言?或者更具体一点,在什么内存管理范式下?从你的标签我猜是 C?
  • 在什么情况下?例如,您是否正在尝试编写一个在运行代码中查找内存泄漏的工具?或者您是否假设您已挂钩到动态内存管理例程,以便您的内存分析器可以拦截内存分配请求?
  • 该工具名为#define malloc。您分配自己的块头并将其保存在链表中。请参阅《Writing Solid Code》一书。

标签: c algorithm pointers


【解决方案1】:
【解决方案2】:

最简单的方法是为应用程序中的每种对象设置一个计数器。分配对象时增加计数器,释放时减少计数器。当应用程序终止时,检查所有计数器是否为零。

【讨论】:

  • 嗯,现在您还必须调试引用计数错误。加倍工作。
  • 这在 C 中比在 C++ 中更难做到。
  • Hans:我不是在谈论引用计数,只是一对简单的 alloc 和 dealloc 函数,用于每种使用的类型,包装 malloc 和 free。在我看来,所有设计良好的应用程序都应该有这些。
  • 你可能不需要对象特定的计数器,只要一个就足以确保你平衡 malloc/calloc() 到 free() 调用。
【解决方案3】:

虽然不是算法,但有大量的第三方工具也可以帮助分析您的代码是否存在内存泄漏。根据您项目的规模,您自己手动跟踪所有分配可能不合理。

如果我在 *nix 环境中,我个人喜欢使用 valgrind。

或者,让你的程序运行很长时间,并从顶部或任务管理器中观察进程使用的内存分配。如果它泄漏,它将持续上升。如果没有,它应该膨胀到它的最大值然后保持停留,或者在这个和一个较低的值之间波动。

不幸的是,增长并不一定等于泄漏,可能只是您的程序需要大量内存。

【讨论】:

    【解决方案4】:

    如果您使用 Windows,则需要 deleaker。如果你使用 *nix 试试 valgrind。

    【讨论】:

      【解决方案5】:

      您好,这是在代码的预处理器指令中检测内存泄漏的方法,包括这些语句

       # define _CRTDbg_Map_Alloc
      
       # include<stdlib.h>
      
       # include<crtdbg.h>
      

      并在主函数中使用此函数转储内存泄漏。

      _CrtDumpMemoryLeaks();
      

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 2012-01-22
        • 2015-02-28
        • 2013-11-14
        • 1970-01-01
        相关资源
        最近更新 更多