【发布时间】:2020-08-17 11:24:07
【问题描述】:
我编写了一个程序,它使用以下属性枚举进程的所有内存区域:MEM_COMMIT 和 PAGE_READWRITE,并且在程序结束时打印找到的所有区域的总大小,一切似乎都运行良好,然后我在 64 位程序上尝试了它,结果发现总区域大小大于我 PC 上可用的 RAM。 在我的 PC 上,有 15.9GB 的 RAM 可用,而我进行的扫描之一是 18.363.846.656 字节(18.3 GB)。 我想知道,这怎么可能?这是我的代码中的错误,还是他们使用了一些我不知道的内存管理方法?
#include <iostream>
#include <Windows.h>
int main()
{
// Get an handle to the process
HWND hWnd = FindWindowA(NULL, "WindowName");
DWORD pid; GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// Declaration of some variables
char* Ptr(0);
MEMORY_BASIC_INFORMATION Mem;
size_t totalSize = 0;
// Start querying
while (VirtualQueryEx(hProcess, Ptr, &Mem, sizeof(MEMORY_BASIC_INFORMATION)))
{
if (Mem.State == MEM_COMMIT && Mem.Protect == PAGE_READWRITE)
{
totalSize += Mem.RegionSize;
std::cout << std::hex << Mem.BaseAddress << " - " << (LPVOID)(Mem.RegionSize + (INT64)Mem.BaseAddress) << " - size:(" << std::dec << Mem.RegionSize << ")\n";
}
Ptr += Mem.RegionSize;
}
std::cout << "[" << totalSize << "]";
CloseHandle(hProcess);
return 0;
}
【问题讨论】:
-
你走的是虚拟内存,不是物理内存。虚拟内存区域可以在任何给定时间交换到磁盘,并且不受物理内存的支持。
-
谢谢,但我想知道如何只考虑物理内存?在 MEMORY_BASIC_INFORMATION 结构中,我看不到任何值可以帮助我了解它是否在物理内存中
标签: c++ memory memory-management