【问题标题】:PROCESS_MEMORY_COUNTERS_EX creates unreliable PrivateUsage field, why?PROCESS_MEMORY_COUNTERS_EX 创建不可靠的 PrivateUsage 字段,为什么?
【发布时间】:2014-04-18 14:43:58
【问题描述】:

在VS 2012上使用以下代码,原生C++开发:

SIZE_T CppUnitTests_MemoryValidation::TakeMemoryUsageSnapshot() {  
    PROCESS_MEMORY_COUNTERS_EX processMemoryCounter;
    GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)
        &processMemoryCounter, sizeof(processMemoryCounter));
    return processMemoryCounter.PrivateUsage;
}

我在每个CPPUnitTest 之前和之后调用此方法并计算PrivateUsage 字段的差异。通常这个差异应该是零,假设我的内存分配没有泄漏。

在我的测试类中只会发生简单的事情。即使没有任何内存分配,只是创建我的测试类的一个实例并再次释放它,有时(不是在每次测试迭代中)差异都会超过零,所以这个方案似乎是不确定的。

有没有比我更有洞察力的人可以解释如何解决这个问题或告诉我我的假设有什么问题?

【问题讨论】:

  • PrivateUsage 包括已释放的堆块,现在位于空闲块列表中,可以重新使用。请改用debug allocator

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


【解决方案1】:

在 Hans Passants 调试分配器链接之后,我注意到有关 Microsoft 的内存泄漏检测工具的更多信息,特别是 _CrtMemCheckpoint 函数。

我点击的链接是“http://msdn.microsoft.com/en-us/library/5tz9b54s(v=vs.90).aspx

现在,当使用此函数拍摄我的内存快照并使用 _CrtMemDifference 函数检查差异时,这似乎工作可靠且具有确定性。

【讨论】:

    【解决方案2】:

    简而言之,您的假设是不正确的。在您的进程中执行内存分配的过程中可能会发生很多其他事情(the Event Tracing thread,以及由您系统上的第三方附加组件创建的任何其他事情),因此偶尔会看到内存使用量增加也就不足为奇了。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2014-12-25
      • 2011-08-05
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多