释放内存不会导致页面错误

Mon*_*nad 1 c windows winapi virtual-memory

与保留和提交虚拟存储器至过程实验,我分配64K字节的内存VirtualAlloc,memcpy"DA测试字符串进去,printf倒是它像一个字符串,释放的内存VirtualFree与所述MEM_RELEASE标志,并且printf"再次ð它.由于某种原因,不会触发页面错误.为什么是这样?

#include <stdio.h>
#include <windows.h>

INT main(DWORD argc, LPSTR argv[]) {
    SYSTEM_INFO info;
    DWORD dwPageSize;
    DWORD dwMemSize;
    LPVOID lpvMem;

    GetSystemInfo(&info);
    dwPageSize = info.dwPageSize;
    dwMemSize = 16 * dwPageSize;

    lpvMem = VirtualAlloc((LPVOID) 0x00F00000, dwMemSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (!lpvMem) {
        printf("Error allocating virtual memory\n");
        return 1;
    }

    printf("lpvMem = 0x%08X\n", (UINT32) (UINT64) lpvMem);

    if (!memcpy(lpvMem, "I love foxes \\(^o^)/", 21)) {
        printf("Error copying memory (error code 0x%08X)\n", GetLastError());
        return 1;
    }

    printf("Before free: %s\n", (LPCSTR) lpvMem);
    VirtualFree(lpvMem, dwMemSize, MEM_RELEASE);
    printf("After free:  %s\n", (LPCSTR) lpvMem);

    fflush(stdout);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

lpvPagedMemory = 0x00F00000
Before free: I love foxes \(^o^)/
After free:  I love foxes \(^o^)/
Run Code Online (Sandbox Code Playgroud)

RbM*_*bMm 10

这一行:

VirtualFree(lpvMem, dwMemSize, MEM_RELEASE);
Run Code Online (Sandbox Code Playgroud)

是一个错误.您没有检查VirtualFree()返回的内容,文档说:

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

所以你需要使用它:

VirtualFree(lpvMem, 0, MEM_RELEASE);
Run Code Online (Sandbox Code Playgroud)

关于页面错误 - 它可以(并且必须)仅在成功调用之后发生VirtualFree().