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

时间:2016-07-25 20:35:02

标签: c windows winapi virtual-memory

在尝试为进程保留和提交虚拟内存时,我用memcpyprintf'da test string分配了64K字节的内存,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; } 。由于某种原因,不会触发页面错误。这是为什么?

lpvPagedMemory = 0x00F00000
Before free: I love foxes \(^o^)/
After free:  I love foxes \(^o^)/

输出:

@LargeTest

1 个答案:

答案 0 :(得分:10)

这一行:

VirtualFree(lpvMem, dwMemSize, MEM_RELEASE);

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

  

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

所以你需要改用它:

VirtualFree(lpvMem, 0, MEM_RELEASE);

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