c - Freed memory not causing page fault -
in experimenting reserving , committing virtual memory process, allocated 64k bytes of memory virtualalloc
, memcpy
'd test string it, printf
'd string, freed memory virtualfree
mem_release
flag, , printf
'd again. reason, no page fault triggered. why this?
#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; }
output:
lpvpagedmemory = 0x00f00000 before free: love foxes \(^o^)/ after free: love foxes \(^o^)/
this line:
virtualfree(lpvmem, dwmemsize, mem_release);
is error. not checking virtualfree()
returns, , documentation says:
dwsize [in]
...
if dwfreetype parameter mem_release, this parameter must 0 (zero). function frees entire region reserved in initial allocation call virtualalloc.
so need use instead:
virtualfree(lpvmem, 0, mem_release);
about page fault - can (and must) happen after successful call virtualfree()
.
Comments
Post a Comment