【问题标题】:Where is my memory?我的记忆在哪里?
【发布时间】:2011-05-15 09:45:42
【问题描述】:

我有一个使用 ffmpeg 进行解码的简单应用程序。

通常它工作得很好。但是,当我尝试播放某个文件时,它开始占用我的内存。即使我释放解码器使用的所有资源,内存也不会被释放。

我尝试运行内存泄漏检测器(英特尔并行检查器),但它没有检测到泄漏,因为内存可能在关机期间被释放。

我的问题是如何查看在运行时分配的内存位置和内存量?

编辑:添加 windows 标签。

【问题讨论】:

  • 也许试试 valgrind
  • 会的。 valgrind 与 intel 并行检查器有什么不同?
  • 请记住,即使内存是 free()'d/deleted ,它通常不会释放回操作系统。它刚刚释放回应用程序内存分配池。
  • 很遗憾我没有安装 Linux,我的应用程序无法在 Linux 上运行。
  • @nos:好点。我正在使用 TBB 内存分配器,所以它可能会保留内存。不过,我需要一些方法来确认这一点。

标签: c++ windows memory-leaks


【解决方案1】:

尝试使用带有选项 --leak-check=full 的 valgrind 来查看是否有任何内存泄漏。 http://valgrind.org/

编辑:现在我看到目标平台是 windows,这个问题可能很有趣:Is there a good Valgrind substitute for Windows?

【讨论】:

  • 好主意。但是我的平台是Windows。我忘了在我的原始帖子中添加标签。我很抱歉。
  • @ronag:有一些商业工具可以用于 Windows 的泄漏搜索,这些工具可以插入 VC++ IDE。 (我的记忆中说“Purify”——它最初是作为商业 Unix 的工具——但我可能会因为我不在 Windows 上开发而脱离基础。)我不知道有任何零成本的。
  • 我确实有“Intel Parallel Inspector”,它是一个内存泄漏检测器。但是,它似乎没有找到它。
【解决方案2】:

如果您可以使用调试 CRT 运行您的应用程序,请使用 CRT 内存泄漏报告功能。

调试 CRT 会跟踪您的分配,并在应用程序退出时告诉您内存泄漏的位置。要记住的一件事是,为了使用这种方法,您必须确保在退出 main 函数之前清理所有资源,否则它们将被报告为泄漏。

这里有详细信息http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

如果这没有发现任何泄漏,我建议让您的程序运行几个小时并检查它可以使用多少内存是否有上限;它可能不是泄漏。

【讨论】:

  • 问题是我的应用程序退出时没有泄漏。它在运行时会泄漏到某个地方。然后在退出时一切都被释放了。
  • 取决于您如何定义泄漏。在我的情况下,它分配所有可用内存并在几秒钟后引发 bad_alloc 或访问冲突。
  • IIRC 您无需等待应用程序退出,但您可以在应用程序中您认为可能发生泄漏的任何位置调用 _CrtDumpMemoryLeaks。不过我已经有一段时间没有使用它了。
  • 您仍然可以使用此功能,只是需要多做一些工作。当您知道您的应用程序已大量泄漏并分析输出以查找可疑条目时,您必须致电_CrtDumpMemoryLeaks。确保您还定义了_CRTDBG_MAP_ALLOC,这样您就可以看到分配发生的位置。除此之外,我认为您没有太多选择。
  • 我尝试过使用 memcheckpoint、memdiff、memdump。但是,我得到了可疑的结果(它说几乎没有分配任何内存)。我想我必须对这些功能做更多的研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2011-07-24
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多