Windows上C ++可执行文件的无法解释的内存泄漏

时间:2019-05-25 20:26:14

标签: c++ windows memory-leaks

我的Visual Studio 2017 C ++ Windows项目使用的内存在运行期间稳定增加。

但是,当我检查内存泄漏时,没有报告。

这是我用来检查内存泄漏的内容:

  • 处于调试模式的Visual Studio,通常会在退出时报告所有内存泄漏,没有报告
  • Visual Studio Heap Profiler,它可以拍摄已分配内存的快照,并指示在exe运行期间分配数量增加,而无需告诉我这些分配在哪里进行。我无法查明进行这些额外分配的代码区域。它们似乎是随机发生的,并且是随机数。
  • 带有!heap命令的WinDbg,它显示exe运行过程中进行的分配数量保持在一定范围内。
  • 内存验证器(https://www.softwareverify.com/cpp-memory.php),它显示了一些内存泄漏,但没有报告是在exe创建的线程中或在应用程序代码中,并且没有有用的堆栈跟踪。 / li>
  • 我自己的实用程序实用程序类,用于跟踪对象的创建和销毁,这些类显示所有对象在预期或退出时都被破坏了。

为确保上述方法切实可行,我还创建了一些强制内存泄漏,已正确报告。

总而言之,我的代码中没有泄漏的分配报告,并且关于这些泄漏,我没有任何有用的信息,例如模块,源文件或堆栈跟踪。

该exe所使用的一个或多个dll可能在其创建的线程中运行了代码泄漏,或者可能使用了某种缓存,但是我没有确凿的证据。

关于如何继续确定导致这些泄漏的原因的任何想法?

说明:我没有发布代码,因为我需要发布整个应用程序,这是不可能的。我不能在一个小项目中复制它。

我不需要代码本身的帮助,我非常有信心那里没有泄漏。我需要寻找一种工具或其他方法来检测对常规方法无效的内存问题,需要帮助。

1 个答案:

答案 0 :(得分:0)

好吧,很难给出确切的答案。 可能要寻找的东西:

  • 检查关键字globalnew,通常您可以使用智能ptrs来避免使用它们
  • 您可以使用delete来避免new[]delete[]
  • 检查std::vector使其保持生命(检查lambda捕获)=>通常,shared_ptr是非所有者的更好选择
  • 检查没有weak_ptr的{​​{1}},最好完全避免。

mallocfree有一个陷阱,尤其是在处理较大的对象时。如果通过make_shared创建对象,则该对象的存储空间和指针的控制块将一步分配。结果,即使在对象被销毁后,也只有在最小的weak_ptr被销毁后,内存才可用。在这种情况下,一切似乎都很好,没有工具可以检测到问题,并且在应用程序退出时不会泄漏。