如何验证内存使用情况 我想实现一个C++函数(使用Win32 API)来获取进程的当前内存使用量。

如何验证内存使用情况 我想实现一个C++函数(使用Win32 API)来获取进程的当前内存使用量。,c++,windows,C++,Windows,我检查了这篇文章中的代码并实现了这个函数 bool GetMemoryUsage( size_t& usageInBytes ) { PROCESS_MEMORY_COUNTERS_EX pmc; if ( GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc)) ) { usageInBytes = pmc.Working

我检查了这篇文章中的代码并实现了这个函数

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
    memoryUsage
    大于
    initialMemoryUsage
    12288,释放内存不会使其减少
  • 如果
    GetMemoryUsage
    使用
    pmc.PrivateUsage
    memoryUsage
    initialMemoryUsage
    都是相等的,即使我分配了一些内存
如何以准确可靠的方式实现
GetMemoryUsage
,使上述测试通过


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

对不起,这样不行

 std::string foo()
 {
     return "hello";
 }
当此函数返回时,可能存在以前不存在的新
std::string
。这并不表示有任何泄漏

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

我想您会发现,了解程序员通常如何调试内存泄漏会更有成效。人们在寻求帮助解决问题时经常犯的一个错误是,他们想出了一种他们认为应该解决问题的方法,并通过这种方法寻求帮助。你就是这么做的


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

你对进程如何使用内存的期望是不正确的。您得到的结果是正确的,并向您展示了实际发生的情况。好的,那么有没有办法知道何时分配了一些内存以及分配了多少内存?或者这根本不可能?这取决于你所说的“内存”和“分配”是什么意思。您当前看到的是何时分配内存以及分配了多少内存。这不是你想的那种记忆。(物理的?虚拟的?保留的?居住的?或者什么?)而且它不是你认为的“分配”的方式。(保留?映射?包含有用数据?或什么?)如果不确切知道您要做什么,很难帮助您完成。你想回答什么问题?尽可能具体。可能是您想要的,但很难说。实际上,我想在运行时检查特定函数调用是否不会导致任何内存泄漏。我想检查函数分配的内存是否已释放。所以我需要知道new/malloc分配了多少内存,但还没有释放。好的。这是我的问题描述。我使用VLD检测并修复系统关键功能中的内存泄漏。现在,为了确保将来没有开发人员会引入新的漏洞,我想在我们的系统测试套件中添加一个新的单元测试,它将调用该函数,并检查堆使用率没有因为调用而增加。测试系统不集成VLD,并且不能使用Microsoft的堆CRT检查器,因为它在发布模式下运行测试。因此,我希望有一个函数可以在某个时刻检查堆的使用情况。您可能想问一个单独的问题以获得更多的可见性。但我认为如果不改变你的环境,这是不容易做到的。您已选择专门禁用所有检测此问题的仪器和工具。heap的发布版本并没有准确地保留这些信息,因为它有成本。也许有人知道一种方法——也许是一个可以链接到发布版本的插入指令的堆?顺便说一句,一个好的答案可以解释为什么
pmc.WorkingSetSize
在我执行
malloc(596)
…-)之后增加了12288事实上说这不可能也是一个可以接受的答案;-)我不知道这是不可能的。很难知道到底发生了什么。可能是更多的代码页出现故障。可能是从操作系统分配了一个大的块,而只返回了其中的一小部分给您。这很复杂。