学习:内存的申请与释放

前言:win32申请内存的学习笔记

申请内存只有两种方式:

1、通过VirtualAlloc/VirtualAllocEx 申请的物理内存:Private Memory 私有物理页

2、通过CreateFileMapping映射 申请的共享内存:Mapped Memory 映射共享物理页

VirtualAlloc

在自己的内存中申请私有内存

#include<Windows.h>

int main() {
	LPVOID p = VirtualAlloc(
		NULL,//要分配的内存区域的地址,除非自己知道哪些地址没有被占用才去写,要不然就为空,系统自动帮你分配
		0x1000 * 2, //申请的内存大小,一般为物理页大小的整数倍
		MEM_COMMIT, //  当内存中的任务执行完成后 1、MEM_RESERVE申请的虚拟内存存在 物理内存不需要存在物理页  2、MEM_COMMIT申请的虚拟内存存在 并且还需要对应的物理内存也存在物理页
		PAGE_READONLY //申请的物理页的属性,比如可读,可读写,可读写执行
		);

	//VirtualFree(p,0x1000*2, MEM_DECOMMIT); // 虚拟地址仍然保留,物理页不保留
	VirtualFree(p, 0, MEM_RELEASE);  // 虚拟地址不保留
	return 0;
}

VirtualAllocEx

可以在别的进程中申请私有内存

	addr = (PDWORD)VirtualAllocEx(
		hProcess, //申请指定进程的句柄
		NULL,  // 安全描述符
		DllPathLen,  // 申请内存的字节大小
		MEM_COMMIT,  // 
		PAGE_READWRITE // 内存的属性
	);

CreateFileMapping:

创建"物理页"内核对象并且内存类型是共享内存,还可以与文件/进程进行关联

#include<Windows.h>
#include<stdio.h>

#define MappingName "myMapping"
int main() {
	HANDLE hMapping;
	PDWORD buf;

	//创建内核对象:物理页
	hMapping = CreateFileMapping(
		INVALID_HANDLE_VALUE, //为NULL则为创建物理页
		NULL,
		PAGE_EXECUTE_READWRITE, //对象页面的属性为可读写执行
		0,
		0x1000,
		MappingName);

	//将物理页与虚拟地址进行关联映射
	buf = (PDWORD)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0x1000);
	
	*buf = 0x12345678;
	printf("%p", buf);  //打印该buf的地址
	getchar();

	//关闭映射
	UnmapViewOfFile(buf);
	CloseHandle(hMapping);
	return 0;

}

释放内存的方式

VirtualAlloc的释放:VirtualFree

VirtualFree(p,0x1000*2, MEM_DECOMMIT); // 虚拟地址仍然保留,物理页不保留
VirtualFree(p, 0, MEM_RELEASE);  // 虚拟地址不保留 物理内存更不保留

VirtualAllocEx的释放:VirtualFreeEx

CreateFileMapping的释放:UnmapViewOfFile(buf);

posted @ 2020-02-03 13:14  zpchcbd  阅读(1681)  评论(0编辑  收藏  举报