3

在 VirtualFree 的 msdn 文档中

BOOL WINAPI VirtualFree(
  _In_  LPVOID lpAddress,
  _In_  SIZE_T dwSize,
  _In_  DWORD dwFreeType
);

dwSize [in] 要释放的内存区域的大小,以字节为单位。

如果 dwFreeType 参数为 MEM_RELEASE,则此参数必须为 0(零)。该函数释放在对 VirtualAlloc 的初始分配调用中保留的整个区域。

似乎系统可以通过地址获得整个区域大小

我的问题是:我该怎么做(通过地址获得整个区域大小)

PS:VirtualQuery API 不能做到这一点

void* p = VirtualAlloc(null, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
p = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p, &im, sizeof(im));

im.RegionSize 是 MEM_COMMIT 的大小,而不是第一次调用 VirtualAlloc 的整个区域大小

4

2 回答 2

4

MEMORY_BASIC_INFORMATION

AllocationBase指向由 VirtualAlloc 函数分配的一系列页面的基地址的指针。BaseAddress 成员指向的页面包含在此分配范围内。

继续查询,直到你掉出边缘:

void* p = VirtualAlloc(NULL, static_cast<SIZE_T>(_K * 128), MEM_RESERVE, PAGE_NOACCESS);
void* p2 = VirtualAlloc(p, _K * 64, MEM_COMMIT, PAGE_READWRITE);
MEMORY_BASIC_INFORMATION im;
VirtualQuery(p2, &im, sizeof(im));
while (im.AllocationBase == p)
{
    p2 = (unsigned char *)p2 + im.RegionSize;
    VirtualQuery(p2, &im, sizeof(im));
}
于 2013-02-25T11:10:45.553 回答
0

这是您必须自己跟踪的信息。

保留地址空间就是这样做的——它保留地址。没有关于该空间有多大的概念,因为您可以保留两个碰巧彼此相邻的块,然后在两个保留空间中提交一个块。

于 2013-02-25T11:06:29.310 回答