根据文档,VirtualFree的第一个参数应该与VirtualAlloc返回的指针相同:
如果dwFreeType参数是MEM_RELEASE,则此参数必须是 VirtualAlloc函数返回时的基地址 页面是保留的。
查看下面的代码,当我添加偏移量0 - FFF(0 - 4095)时,函数VirtualFree也可以成功。
为什么VirtualFree的这种调用没有失败?代码如下。
#include <Windows.h>
void main()
{
size_t size = 4*4096;
VOID* ptr = (VOID*)VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!ptr)
{
printf("VirtualAlloc failed with status %lu\n", GetLastError());
return;
}
else
{
printf("Pointer = %p\n", ptr);
}
printf(" ");
scanf("%p", (VOID*)&ptr);
printf("pointer = %p\n", ptr);
BOOL status = VirtualFree(ptr, 0, MEM_RELEASE);
if (!status)
{
printf("VirtualFree failed with status %lu\n", GetLastError());
}
else
{
printf("VirtualFree success\n");
}
getchar();
return;
}