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);

  • 相关阅读:
    spring.net 结合简单三层实例
    Spring.Net 如何管理您的类___对象的手动装配
    性能优化小结
    C#实例解析适配器设计模式
    谈AOP要step by step
    C#对图片文件的压缩、裁剪操作初探
    Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)
    多线程实现资源共享的问题学习与总结
    ASP.NET 设计模式
    Mac技巧索引
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12255310.html
Copyright © 2011-2022 走看看