zoukankan      html  css  js  c++  java
  • 学习:内存的申请与释放

    申请内存只有两种方式:

    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(p,0x1000*2, MEM_DECOMMIT); // 虚拟地址仍然保留,物理页不保留
    VirtualFree(p, 0, MEM_RELEASE);  // 虚拟地址不保留 物理内存更不保留
    

    VirtualAllocEx:

    VirtualFreeEx

    CreateFileMapping:

    UnmapViewOfFile(buf);

  • 相关阅读:
    BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
    BZOJ 2091: [Poi2010]The Minima Game 博弈dp
    BZOJ 4459: [Jsoi2013]丢番图 数学推导
    BZOJ 3561: DZY Loves Math VI 莫比乌斯反演+复杂度分析
    BZOJ 3048: [Usaco2013 Jan]Cow Lineup 双指针
    PAT Basic 1012 数字分类 (20 分)
    PAT Basic 1008 数组元素循环右移问题 (20 分)
    大数据数据库HBase(一)——架构原理
    PAT Basic 1046 划拳 (15 分)
    PAT Basic 1026 程序运行时间 (15 分)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12255310.html
Copyright © 2011-2022 走看看