如何验证内存使用情况

How to verify memory usage

本文关键字:内存 用情 情况 验证 何验证      更新时间:2023-10-16

我想实现一个c++函数(使用WIN32 API)来获取我的进程的当前内存使用情况。

我检查了这篇文章的代码如何从进程内部确定CPU和内存消耗?并实现了该功能。

bool GetMemoryUsage( size_t& usageInBytes )
{
    PROCESS_MEMORY_COUNTERS_EX pmc;
    if ( GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc)) )
    {
        usageInBytes = pmc.WorkingSetSize;
        return true;
    }
    else
    {
        return false;
    }
}

但是,当我尝试这样测试它时:

size_t initialMemoryUsage = 0;
GetMemoryUsage( initialMemoryUsage );
size_t use = 596;
void* memUsed = malloc( use );
size_t memoryUsage = 0;
GetMemoryUsage( memoryUsage );
assert( memoryUsage == initialMemoryUsage + 596 );
free( memUsed );
GetMemoryUsage( memoryUsage );
assert( memoryUsage == initialMemoryUsage );

失败:

  • 如果GetMemoryUsage使用pmc.WorkingSetSize, memoryUsageinitialMemoryUsage大12288,释放内存不会使其减少
  • 如果GetMemoryUsage使用pmc.PrivateUsage, memoryUsageinitialMemoryUsage都是相等的,即使我分配了一些内存

我如何以准确可靠的方式实现GetMemoryUsage以使上述测试通过?

实际上,我想在运行时检查一个特定的函数调用不会引入任何内存泄漏。我想检查函数分配的内存是否被释放了。所以我需要知道在某个时刻,new/malloc分配了多少内存,还没有释放。

对不起,不是这样的。

 std::string foo()
 {
     return "hello";
 }

当这个函数返回时,可能有一个新的以前不存在的std::string。这并不表示有任何泄漏。

你对软件的工作方式有期望,但这并不是软件的工作方式。

我想你会发现更有成效的是看看程序员通常是如何调试内存泄漏的。人们在寻求帮助解决问题时常犯的一个错误是,他们想到了一个他们认为应该解决问题的方法,然后请求帮助让这个方法发挥作用。这就是你在做的。

相反,尽可能详细地描述你的实际问题,并请专家建议他们认为你应该如何解决它。他们更有可能提出有效的方法。