【问题标题】:Can I identify the cause of a memory leak from a heap snapshot?我可以从堆快照中找出内存泄漏的原因吗?
【发布时间】:2021-05-19 07:34:34
【问题描述】:

My program 在关闭时检测到内存泄漏,我想解决它。我已经用智能指针替换了我对new 的唯一用法,但是我使用了很多裸露的char[],并且真的没有时间去检查我在项目中使用的每个指针。

  • 我能否从这个堆快照中找出内存泄漏的原因?
  • 有没有办法下载这个文件并通过它搜索那个特定的内存位置?
  • 我是否因为 Windows 会清理内存而浪费时间尝试诊断此问题?

【问题讨论】:

    标签: visual-studio visual-c++ memory-leaks


    【解决方案1】:

    我可以从这个堆快照中找出内存泄漏的原因吗?

    通常不会。您将需要至少 2 个快照并比较它们以找出差异。然后,您将浏览在这 2 个快照之间运行的代码,看看差异来自哪里。

    这需要大量的纪律并严格遵循内存分析的步骤:

    1. 执行一次有问题的步骤。这将确保完成任何延迟初始化。
    2. 拍摄快照
    3. 再次执行相关步骤。确保您回到与之前相同的位置。
    4. 拍摄快照
    5. 比较快照

    结果可能仍然包含误报,例如在日志窗口中输出(前 20 行,后 40 行)。

    有没有办法下载这个文件并通过它搜索那个特定的内存位置?

    我不知道这是否内置于 Visual Studio 中。但是您当然可以创建一个具有完整内存的故障转储文件,然后在那里查找。

    我是否在浪费时间尝试诊断此问题,因为 Windows 无论如何都会清理内存?

    恕我直言,您没有浪费时间。如果应用程序发生内存泄漏并用完地址空间,则应用程序可能会崩溃并导致用户数据丢失。你会发现问题并成为一个更好的程序员。您将学到一些对其他编程语言也有帮助的东西。

    但除此之外,您是对的:当进程终止时,Windows 将释放内存。因此,重新启动该程序可能会有所帮助,并且可能会在几个月内为客户提供解决方法。

    【讨论】:

    • 感谢您的快速回复。从你的回答听起来你相信我有一个持续的内存泄漏,但据我所知,只有在我关闭应用程序时才会发生内存泄漏。我现在正在给 Deleaker 一个机会,我想我会看看结果如何。
    • @Skewjo:对不起,我没有得到应用程序即将从原始问题终止的事实。这些是误报的可能性更高。也许您想尝试this approach 而不是引入新工具。
    • 感谢其他问题的链接。我最终安装了新工具,它工作得很好,帮助我理解了为什么堆快照无法识别泄漏。它在关闭程序后引起了惊人的大量内存泄漏,但[共识(至少关于第一次泄漏)似乎是可以安全地忽略外部库中的静态执行。 ](stackoverflow.com/questions/66225765/…)
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2023-03-08
    • 2011-01-14
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多