1

我在运行我的程序时遇到了这个问题:

  • 当我的程序的一项功能正在运行时,内存消耗会迅速增加。
  • 我使用性能监视器和虚拟泄漏检测,都说没有泄漏。
  • 功能结束后(程序未退出),内存会慢慢下降到正常水平。
  • 程序基本上是C#、WPF、C++;

因此,当内存消耗变高时,我的程序驱动的硬件(电机)响应非常缓慢。

我很困扰。这是内存泄漏吗?

我知道可能很难确定问题出在哪里,但是我应该如何看待这个问题有什么共同的逻辑吗?或者有什么常用的工具?就像检查汽车上的进气泄漏/系统倾斜通常从管道、质量空气流量传感器或 O2 传感器开始......

非常感谢!

4

2 回答 2

1

您可以尝试几件事 - 尝试运行 Sysinternals ProcessMonitor 工具(Process Monitor v3.2)并正确配置符号路径和源代码路径(假设您在 Windows 平台上运行)。日志很可能会告诉您导致泄漏的行号和来源。您需要知道如何使用进程监视器并浏览日志。

否则,您也可以尝试使用以下 CRT API 来跟踪内存分配/释放并吐出内存泄漏转储以供进一步调查。以下代码仅在调试模式下有效。

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

    #ifdef _DEBUG   
      #ifndef DBG_NEW      
         #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )      
      #define new DBG_NEW   
      #endif
    #endif  // _DEBUG

    _CrtMemState crtMemStateStart;
    _CrtMemState crtMemStateFinish;

    _CrtMemCheckpoint(&crtMemStateStart);


    // Your suspisious code


     _CrtMemCheckpoint(&crtMemStateFinish);

      int nDifference(0);
      _CrtMemState crtMemStateDifference;
      nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish);

    if(nDifference > 0)
        _CrtDumpMemoryLeaks();

有关更多信息,请参阅此链接:使用 CRT 库查找内存泄漏

请记住,内存泄漏可能很难找到,尤其是在涉及 COM 代码的情况下。但是拥有正确的知识和工具肯定会让生活变得更轻松。

于 2013-10-24T22:23:46.170 回答
0

内存分析器对我有用:

Memory Profiler 试用版下载

这是试用版,我很喜欢。

于 2013-10-25T17:47:44.917 回答