本文共 4828 字,大约阅读时间需要 16 分钟。
代码一个一个的输入,有点累,但也充实。
感觉收获较多。
特别是书中将C标准库的malloc最终调用的是HeapAlloc函数。
而相对于堆内存管理负责的HeapAlloc(GlobalAlloc,LocalAlloc),属于虚拟内存管理范围的VirtualAlloc更底层。
这对理解操作系统实现及以后的软件性能及内存泄漏调度,更有帮助。
Heap.c
1 #include2 #include 3 4 #define MEM_BLOCK_SIZE 32 5 6 BOOL ShowMemContent(LPVOID, SIZE_T); 7 int main(void) 8 { 9 HANDLE hHeap = GetProcessHeap();10 LPVOID lpSrc;11 LPVOID lpDis;12 13 lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);14 lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);15 16 printf("HeapAlloc distribut but not make zero: \n");17 ShowMemContent(lpDis, MEM_BLOCK_SIZE);18 19 ZeroMemory(lpDis, MEM_BLOCK_SIZE);20 printf("ZeroMemory make zero: \n");21 ShowMemContent(lpDis,MEM_BLOCK_SIZE);22 23 FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB);24 FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA);25 CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE);26 27 printf("FillMemory fill Memory: \n");28 ShowMemContent(lpDis,MEM_BLOCK_SIZE);29 30 HeapFree(hHeap, 0, lpSrc);31 HeapFree(hHeap, 0, lpDis);32 return 0;33 }34 35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize)36 {37 BYTE lpShow[MEM_BLOCK_SIZE];38 INT i;39 40 if(dwSize > MEM_BLOCK_SIZE)41 {42 printf("over-flow!");43 return FALSE;44 }45 46 CopyMemory((LPVOID)lpShow, lpMem, dwSize);47 for(i = 0; i < dwSize; i++)48 {49 printf("%.2x",lpShow[i]);50 if(!((i+1)%16))51 {52 printf("\n");53 }54 }55 printf("\n");56 return TRUE;57 }
Virtual.c
1 #include2 #include 3 4 int main(void) 5 { 6 SIZE_T sizeVirtual = 4000; 7 LPVOID lpRound = (LPVOID)0x100000FF; 8 MEMORY_BASIC_INFORMATION mbi; 9 10 LPVOID lpAddress = VirtualAlloc(11 lpRound, sizeVirtual,12 MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE13 );14 if(lpAddress == NULL)15 {16 printf("VirtualAlloc error: %d\n",GetLastError());17 return 1;18 }19 printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");20 CopyMemory(lpAddress, "Hello", lstrlen("Hello"));21 printf("Alloction,Copy sucess.address: 0x%.8x, content: %s\n",lpAddress, lpAddress);22 VirtualQuery(lpAddress, &mbi, sizeof(mbi));23 printf("Information from VirtualQuery: \n"24 "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"25 "AllocationProtect:0x%.8x\tRegionSize:%u\t"26 "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",27 mbi.BaseAddress,mbi.AllocationBase,28 mbi.AllocationProtect,mbi.RegionSize,29 mbi.State,mbi.Protect,mbi.Type30 );31 32 printf("Free: DECOMMIT\n");33 if(!VirtualFree(lpRound, sizeVirtual, MEM_DECOMMIT))34 {35 printf("VirtualFree error: %d",GetLastError());36 return 1;37 }38 39 VirtualQuery(lpAddress, &mbi, sizeof(mbi));40 printf("Information from VirtualQuery: \n"41 "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"42 "AllocationProtect:0x%.8x\tRegionSize:%u\t"43 "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",44 mbi.BaseAddress,mbi.AllocationBase,45 mbi.AllocationProtect,mbi.RegionSize,46 mbi.State,mbi.Protect,mbi.Type47 );48 49 printf("Free:RELEASE\n");50 if(!VirtualFree(lpAddress, 0, MEM_RELEASE))51 {52 printf("VirtualFree error: %d",GetLastError());53 return 1;54 }55 return 0;56 }
MemOp.c
1 #include2 #include 3 4 #define MEM_BLOCK_SIZE 32 5 6 BOOL ShowMemContent(LPVOID, SIZE_T); 7 int main(void) 8 { 9 HANDLE hHeap = GetProcessHeap();10 LPVOID lpSrc;11 LPVOID lpDis;12 13 lpSrc = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);14 lpDis = HeapAlloc(hHeap, 0, MEM_BLOCK_SIZE);15 16 printf("HeapAlloc distribut but not make zero: \n");17 ShowMemContent(lpDis, MEM_BLOCK_SIZE);18 19 ZeroMemory(lpDis, MEM_BLOCK_SIZE);20 printf("ZeroMemory make zero: \n");21 ShowMemContent(lpDis,MEM_BLOCK_SIZE);22 23 FillMemory(lpSrc, MEM_BLOCK_SIZE, 0xBB);24 FillMemory(lpSrc, MEM_BLOCK_SIZE/2, 0xAA);25 CopyMemory(lpDis, lpSrc, MEM_BLOCK_SIZE);26 27 printf("FillMemory fill Memory: \n");28 ShowMemContent(lpDis,MEM_BLOCK_SIZE);29 30 HeapFree(hHeap, 0, lpSrc);31 HeapFree(hHeap, 0, lpDis);32 return 0;33 }34 35 BOOL ShowMemContent(LPVOID lpMem, SIZE_T dwSize)36 {37 BYTE lpShow[MEM_BLOCK_SIZE];38 INT i;39 40 if(dwSize > MEM_BLOCK_SIZE)41 {42 printf("over-flow!");43 return FALSE;44 }45 46 CopyMemory((LPVOID)lpShow, lpMem, dwSize);47 for(i = 0; i < dwSize; i++)48 {49 printf("%.2x",lpShow[i]);50 if(!((i+1)%16))51 {52 printf("\n");53 }54 }55 printf("\n");56 return TRUE;57 }
运行图:
转载地址:http://rjilx.baihongyu.com/