美文网首页
5.5 分配和释放可读可写的虚拟内存页面

5.5 分配和释放可读可写的虚拟内存页面

作者: f675b1a02698 | 来源:发表于2017-09-14 16:15 被阅读0次

效果

源码

#include

#include

int main(int argc, PCHAR argv[]){

SIZE_T sizeVirtual = 4000;//大小

LPVOID lpRound = (LPVOID)0x100000FF;//地址

MEMORY_BASIC_INFORMATION mbi;//内存信息

//分配内存,直接分配已提交的内存

LPVOID lpAddress = VirtualAlloc(lpRound, sizeVirtual, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

if (lpAddress == NULL){

printf("分配虚拟内存失败: %d\n", GetLastError());

return 1;

}

printf("分配成功: MEM_COMMIT | MEM_RESERVE 内存已从 空闲 提交为 已提交\n");

//复制数据到内存中

CopyMemory(lpAddress, TEXT("misaka"), lstrlen(TEXT("misaka")));

printf("复制成功,地址: 0x%x, 内容: %s\n", lpAddress, lpAddress);

//获取内存信息并打印

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//释放内存,将页面变为保留状态

printf("释放内存,将页面变为保留状态 DECOMMIT\n");

if (!VirtualFree(lpRound, sizeVirtual, MEM_DECOMMIT)){

printf("释放虚拟内存失败: %d\n", GetLastError());

return 1;

}

//再次获取内存信息

VirtualQuery(lpAddress, &mbi, sizeof(mbi));

printf("使用VirtualQuery函数获得的信息是;\n");

printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);

printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);

printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);

//释放内存,将页面变为空闲状态

printf("释放内存,将页面变为空闲状态 RELEASE\n");

if (!VirtualFree(lpAddress, 0, MEM_RELEASE)){

printf("释放虚拟内存失败: %d\n", GetLastError());

return 1;

}

//虽然设置的地址是0x100000FF,大小4000(FA0),跨越了两个虚拟内存页

//所以VirtualAlloc函数自动进行了对齐,这是虚拟内存分配对齐机制

//代码中第二次使用VirtualFree参数不同,使用MEM_RELEASE参数释放虚拟内存必须

//这样释放对齐后的页基址

getchar();

return 0;

}

相关文章

  • 5.5 分配和释放可读可写的虚拟内存页面

    效果 源码 #include #include int main(int argc, PCHAR argv[]){...

  • 滚动事件

    (1)、scrollTop 属性 获取滚动高度 可读可写 (2)、获取的是页面向上滚动的高度: ...

  • arm64汇编篇-08内存分区及adrp指令

    内存分区 代码区 特点: 可读可写可执行栈区域 放参数和局部变量堆区域 动态申请 可读可写全局: 可读可写常...

  • Android内存管理机制

    Linux 的虚拟内存、物理内存、磁盘 为什么要有虚拟内存的概念 进程创建时,会分配4G的虚拟内存,如果分配物理内...

  • 内存分区域

    内存分区域 代码区:可读可写 栈区域:放参数和局部变量 堆区域:动态申请 可读可写 全局变量区:可读可写 常量区:只读

  • 【练习】成绩

    /* 成绩类: C语言成绩(可读可写) OC成绩(可读可写) 总分(只读) 平均分(只读) */ main.h #...

  • 汇编学习(二)

    1、内存 内存是分区域的: 代码区 : 可读可写可执行栈区 :存放参数和局部变量 可读可写 动态申请堆区:可读可...

  • C/C++程序的5种内存存储区及示意

    操作系统中的内存一般分为虚拟内存和物理内存,本文主要讨论的是虚拟内存中的内存分配方式与内存存储区的内容。 内存分配...

  • 属性readwrite、readonly、assign、reta

    1.readwrite:修饰对象可读可写,会生成getter和setter方法2.readonly:修饰对象仅可读...

  • brk和sbrk及内存分配函数相关(转自CSDN)

    brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空...

网友评论

      本文标题:5.5 分配和释放可读可写的虚拟内存页面

      本文链接:https://www.haomeiwen.com/subject/kdgqsxtx.html