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

  • 相关阅读:

    IT人的素质 & 设计杂谈
    结构化思维思维的结构
    [WM].NET CF下如何提高应用程序的性能 【转载】
    无题
    [WM]谁抢走了应用程序的性能? 【转载】
    繁体编码文本文件转换为简体编码的工具
    生成VB多行字符串常量的工具
    跟我一步一步开发自己的Openfire插件
    cnblogs博文浏览[推荐、Top、评论、关注、收藏]利器代码片段
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12255310.html
Copyright © 2011-2022 走看看