【发布时间】:2024-05-03 11:45:02
【问题描述】:
我知道这可能被认为是一个愚蠢的问题。但我的好奇心强于对投票的恐惧。下面的代码简单地保留了 1GB 的进程虚拟内存,打印了保留块的地址并释放了该块。
#include <iostream>
#include <Windows.h>
int main()
{
// Reserves 1GB of the process virtual memory
LPVOID lp1 = VirtualAlloc((LPVOID)NULL, 0x40000000, MEM_RESERVE, PAGE_NOACCESS);
std::cout << lp1 << '\n';
// Releases the 1GB block of virtual memory
VirtualFree(lp1, NULL, MEM_RELEASE);
}
我在x64机器上运行这段代码几次,得到lp1的以下地址:
0x1e 9c22 00000xe1 8000 00000x16 92a3 00000x34 83ec 0000
为什么地址从一个运行到另一个变化如此之大?我知道 MS 文档对此没有任何说明,但我想知道对于这种奇怪的行为是否有合理的解释?
【问题讨论】:
-
您可能还想意识到这只是一个保留,还没有提交任何内容。它只是在可用的虚拟地址空间中找到一块并保留它。可能,诸如地址空间随机化之类的东西也发挥了作用。
标签: c windows winapi memory-management