C++ 指针错误的VirtualFree

C++ 指针错误的VirtualFree,c++,memory-management,free,C++,Memory Management,Free,根据文档,VirtualFree的第一个参数应该与VirtualAlloc返回的指针相同: 如果dwFreeType参数是MEM_RELEASE,则此参数必须是 当域为时VirtualAlloc函数返回的基址 页面保留 看看下面的代码,当我添加偏移量0-FFF(0-4095)时,VirtualFree函数也可以成功 为什么这种对VirtualFree的呼吁没有失败?代码如下 #include <Windows.h> void main() { size_t size = 4

根据文档,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;
}
#包括
void main()
{
尺寸=4*4096;
VOID*ptr=(VOID*)VirtualAlloc(空、大小、内存保留、内存提交、页面读写);
如果(!ptr)
{
printf(“VirtualAlloc失败,状态为%lu\n”,GetLastError());
返回;
}
其他的
{
printf(“指针=%p\n”,ptr);
}
printf(“”);
scanf(“%p”、(VOID*)和ptr);
printf(“指针=%p\n”,ptr);
BOOL status=VirtualFree(ptr,0,MEM_发布);
如果(!状态)
{
printf(“VirtualFree失败,状态为%lu\n”,GetLastError());
}
其他的
{
printf(“VirtualFree成功”\n);
}
getchar();
返回;
}

我不认为文档中说它一定会失败。最有可能的是轮换到页面大小,这是一个非常便宜的操作(只需按位执行&)。但是,除非文档明确说明,否则不应该依赖它(例如,对于其他内核版本可能不同)。它没有做您期望它做的事情。我认为这是失败的,我认为文件不一定会失败。最有可能的是轮换到页面大小,这是一个非常便宜的操作(只需按位执行&)。但是,除非文档明确说明,否则不应该依赖它(例如,对于其他内核版本可能不同)。它没有做您期望它做的事情。我认为失败了。