以下是在Windows XP上使用VS2010编译和运行的C ++代码示例。
它打印"私有字节"分配前后。
void PrintPrivateBytes()
{
HANDLE current_process;
PROCESS_MEMORY_COUNTERS_EX pmc;
current_process = GetCurrentProcess();
if (!GetProcessMemoryInfo(current_process, (PPROCESS_MEMORY_COUNTERS)&pmc, sizeof(pmc)))
{
std::cout << "\nGetProcessMemoryInfo failed" ;
return;
}
std::cout << "\nProcess private bytes: " << pmc.PrivateUsage/1024 << " KB";
}
int _tmain(int argc, _TCHAR* argv[])
{
// Code demonstrating private bytes doesn't change
std::cout << "\n\nBefore allocating memory" ;
PrintPrivateBytes();
char* charptr = new char[8192];
std::cout << "\n\nAfter allocating 8 KB memory" ;
PrintPrivateBytes();
delete[] charptr;
std::cout << "\n\nAfter deleting memory" ;
PrintPrivateBytes();
int RetVal = _heapmin();
std::cout << "\n\nAfter calling _heapmin" ;
PrintPrivateBytes();
return 0;
}
这是输出:
在分配内存之前
处理专用字节:416 KB
分配内存后
处理专用字节:428 KB
删除内存后
处理专用字节:428 KB
致电_heapmin后
处理专用字节:428 KB
它表示&#34;私有字节&#34;并不反映过程的确切内存使用情况。
哪种Windows API /结构有助于查找完全内存使用过程? (工作集也没用。它只反映了物理内存的使用方式)
答案 0 :(得分:1)
您检查私有字节的解决方案是正确的,只有您对_heapmin的假设是错误的。
_heapmin无法正常工作。 _heapmin是documented as&#34;将未使用的堆内存释放到操作系统。&#34;
实现(参见&#34; \ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ crt \ src \ heapmin.c&#34;)
int __cdecl _heapmin(void)
{
if ( HeapCompact( _crtheap, 0 ) == 0 ) {
return -1;
}
else {
return 0;
}
}
尽管返回堆中最大的空闲块的大小,HeapCompact仍然是documented通常不做任何事情。如果使用特殊的全局(调试目的)标志,它只会做一些额外的事情。