PROCESS_MEMORY_COUNTERS_EX创建不可靠的PrivateUsage字段,为什么?

时间:2014-03-13 17:05:42

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

在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字段的差异。通常情况下,这个差异应为零,假设我的内存分配没有泄漏。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

现在,当使用此函数获取内存快照并使用_CrtMemDifference函数检查差异时,这似乎可靠且确定性。