如何验证内存使用情况
How to verify memory usage
我想实现一个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
,memoryUsage
比initialMemoryUsage
大12288,释放内存不会使其减少 - 如果
GetMemoryUsage
使用pmc.PrivateUsage
,memoryUsage
和initialMemoryUsage
都是相等的,即使我分配了一些内存
我如何以准确可靠的方式实现GetMemoryUsage
以使上述测试通过?
实际上,我想在运行时检查一个特定的函数调用不会引入任何内存泄漏。我想检查函数分配的内存是否被释放了。所以我需要知道在某个时刻,new/malloc分配了多少内存,还没有释放。
对不起,不是这样的。
std::string foo()
{
return "hello";
}
当这个函数返回时,可能有一个新的以前不存在的std::string
。这并不表示有任何泄漏。
你对软件的工作方式有期望,但这并不是软件的工作方式。
我想你会发现更有成效的是看看程序员通常是如何调试内存泄漏的。人们在寻求帮助解决问题时常犯的一个错误是,他们想到了一个他们认为应该解决问题的方法,然后请求帮助让这个方法发挥作用。这就是你在做的。
相反,尽可能详细地描述你的实际问题,并请专家建议他们认为你应该如何解决它。他们更有可能提出有效的方法。相关文章:
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 针对某些特定用例的C++原子内存排序
- 用C++压缩内存中的位图
- 用c++防止内存泄漏
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 大约"circular reference",我用了weak_ptr但仍然发生内存泄漏
- 你能用内存反序列化字节吗?
- 使用重载的 new 和 delete 运算符跟踪已用内存
- 用C 和Marshall分配给C#的内存
- 当我用clang编译代码时,GCOV会出现内存错误
- 用多个传感器克服Arduino内存限制
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- CUDA:共享内存的超载以用多个数组实现还原方法
- 我可以动态分配以前分配的内存,但用不同的指针分配
- 从多个线程写入内存区域是否会导致争用?
- 用valgrind分析c++字符内存泄漏
- 为什么用空函数运行std::线程会花费大量内存
- 用new分配4k int后的内存覆盖
- 定义一个C宏并将内存地址设置为用C和C++编写的结构成员
- 除了内存管理,QObject的父级是做什么用的?