内存管理

本文详细探讨了内存管理的各个方面,包括堆管理的原理与实践,虚拟内存如何提供超出物理内存的地址空间,内存映射在文件操作和进程通信中的应用,以及如何遍历进程的虚拟内存空间,揭示了内存管理的复杂性和效率优化的关键点。
摘要由CSDN通过智能技术生成

堆管理

//创建一个堆,第三个参数为零代表会自动增长的堆
	HANDLE      hHeap = HeapCreate(0, 0, 0);
	SYSTEM_INFO si;     //系统信息
	GetSystemInfo(&si); // 获取系统信息
	//在堆上分配3个页面大小的内存
	LPVOID lpMem = HeapAlloc(hHeap, 
		HEAP_ZERO_MEMORY, si.dwPageSize * 3);
	HeapFree(hHeap, 0, lpMem);
	HeapDestroy(hHeap);

	HANDLE      hHeap = GetProcessHeap(); // 获取默认堆
	SYSTEM_INFO si;                       //系统信息
	GetSystemInfo(&si);                   // 获取系统信息
	//在堆上分配3个页面大小的内存
	lpMem = HeapAlloc(hHeap, 
		HEAP_ZERO_MEMORY, si.dwPageSize * 3);
	HeapFree(hHeap, 0, lpMem);
	//HeapDestroy( hHeap );//系统堆不能销毁

虚拟内存管理

// 	申请虚拟内存
//第一个参数为NULL的话由系统确认分配区域的位置
//第二个参数为分配的大小,会自动对齐,对齐粒度为一页4kb
//
// 		LPVOID lpMem = VirtualAlloc(NULL,
// 			1,
// 			MEM_COMMIT,
// 			PAGE_READWRITE);
// 		memcpy(lpMem, "hello", sizeof("hello"));
//	VirtualFree(lpMem, 0, MEM_RELEASE);

//VirtualAllocEx为指定进程分配新的虚拟地址空间
 	DWORD dwPid = 38096;		//进程pid
 	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);//打开进程
 	LPVOID lpMem = VirtualAllocEx(hProcess, NULL,
		1,
		MEM_COMMIT,
		PAGE_READWRITE);
// 	//memcpy(lpMem, "hello", sizeof("hello"));
// 	DWORD dwWrite;
//  // 将数据写入指定进程hProcess中的内存区域lpMem
// 	WriteProcessMemory(hProcess, lpMem, "hello", sizeof("hello"), &dwWrite);
// 	char szStr[100] = {};
	//从指定进程hProcess中的内存区域lpMem读取数据
// 	ReadProcessMemory(hProcess, lpMem, szStr, sizeof(szStr), &dwWrite);
// 	printf("%X\n", lpMem);
// 	system("pause");
//  释放分配的虚拟内存
// 	VirtualFreeEx(hProcess,lpMem, 0, MEM_RELEASE);


	//修改内存属性API
	DWORD dwOld;
	//修改分配的虚拟内存属性为只读
	//VirtualProtect(lpMem, 1, PAGE_READONLY, &dwOld);
	//memcpy(lpMem, "world", sizeof("world"));//error 访问异常

	//恢复原属性
	//VirtualProtect(lpMem, 1, dwOld, &dwOld);

	//修改指定进程分配的虚拟内存属性为只读
	VirtualProtectEx(hProcess, lpMem, 1, PAGE_READONLY, &dwOld);

	 DWORD dwWrite;
	 WriteProcessMemory(hProcess, lpMem, "hello", sizeof("hello"), &dwWrite);
	 char szStr[100] = {
   };
	 ReadProcessMemory(hProcess, lpMem, szStr, sizeof(szStr), 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值