gpt4 book ai didi

c++ - "Private Bytes"没有反射(reflect)出来。如何找到进程分配的确切内存?

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:55 24 4
gpt4 key购买 nike

这是在 Windows XP 上使用 VS2010 编译和运行的 C++ 代码示例。

它在分配前后打印“私有(private)字节”。

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;
}

这是输出:

Before allocating memory

Process private bytes: 416 KB

After allocating memory

Process private bytes: 428 KB

After deleting memory

Process private bytes: 428 KB

After calling _heapmin

Process private bytes: 428 KB

它表示“私有(private)字节”不反射(reflect)进程的确切内存使用情况。

哪个 Windows API/结构将有助于找到进程的确切内存使用情况?(工作集也没有用,它只是反射(reflect)了物理内存的使用情况)

最佳答案

您检查私有(private)字节的解决方案是正确的,只是您对 _heapmin 的假设是错误的。

_heapmin 不像记录的那样工作。 _heapmin 是 documented作为“将未使用的堆内存释放给操作系统。”

实现(参见“\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\heapmin.c”)是

int __cdecl _heapmin(void)
{
if ( HeapCompact( _crtheap, 0 ) == 0 ) {
return -1;
}
else {
return 0;
}
}

HeapCompact 是 documented尽管返回了堆中最大的空闲 block 的大小,但通常什么也不做。如果使用特殊的全局(调试目的)标志,它只会做一些额外的事情。

关于c++ - "Private Bytes"没有反射(reflect)出来。如何找到进程分配的确切内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24402797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com