带有错误指针的VirtualFree

时间:2015-10-26 11:25:38

标签: 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*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;
}

0 个答案:

没有答案