VirtualAlloc的使用

VirtualAlloc是Windows API中用于在进程的虚拟地址空间中预定或提交内存的函数。它可以用于大块内存的分配,特别是涉及到跨进程共享内存的场景。VirtualFree用于释放由VirtualAlloc分配的内存。该函数会将分配的地址圆整到64KB的倍数,并且在某些系统上,使用MEM_RESET标志可以清除RAM页面内容,但并非所有Windows版本都支持此功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在应用程序中使用虚拟内存(VirtualAlloc VirtualFree)

本文转载以下博客,百度百科,cpp文档

https://blog.youkuaiyun.com/baidu_25539425/article/details/78764156

https://blog.youkuaiyun.com/u012372584/article/details/79621538

https://www.cnblogs.com/arsense/p/6505690.html

https://baike.baidu.com/item/VirtualAlloc/1606859?fr=aladdin

可以简单认为,用于一个申请空间的接口。

VirtualAlloc是一个Windows API函数,它包含在windows系统文件Kernel32.dll中,编程时直接使用就可以了,不需要再下载。

该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页

如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0;

VirtualAlloc是Windows提供的API,通常用来分配大块的内存。例如如果想在进程A和进程B之间通过共享内存的方式实现通信,可以使用该函数(这也是较常用的情况)。不要用该函数实现通常情况的内存分配。该函数的一个重要特性是可以预定指定地址和大小的虚拟内存空间。例如,希望在进程的地址空间中第50MB的地方分配内存,那么将参数 50*1024*`1024 = 52428800 传递给pvAddress,将需要的内存大小传递给dwSize。如果系统有足够大的闲置区域能满足请求,则系统会将该块区域预订下来并返回预订内存的基地址,否则返回NULL。

使用VirtualAlloc分配的内存需要使用VirtualFree来释放。

VirtualAlloc作用

1、在虚拟地址空间中预定一块内存区域;

2、调拨物理存储器。

此虚拟内存非彼虚拟内存,此虚拟内存实际上指的是虚拟地址空间 
LPVOID VirtualAlloc{ 
LPVOID lpAddress, // 要分配的内存区域的地址 
DWORD dwSize, // 分配的大小 
DWORD flAllocationType, // 分配的类型 
DWORD flProtect // 该内存的初始保护属性 
}; 
1.这个函数可以用来对虚拟地址空间进行分配(保留操作MEM_RESERVE) 
2.这个函数可以把已经保留的虚拟地址提交到物理存储器(MEM_COMMIT) 
3.这个函数可以使RAM上的内容无效(MEM_RESET)

这个函数的注意点 
1.该函数会将传入lpAddress圆整为64KB(分配粒度)的倍数,然后通过返回值传一个基地址给你,也就是说该函数返回的值要么为NULL,要么为64KB的倍数 
2.如果该函数调用失败,会直接返回NULL 
3.当函数进行保留操作时,不管使用怎样的保护属性,都对提交的保护属性没影响,但是,若是想让系统高效运行,最好让保留操作和提交操作的保护属性一致 
4.保留操作和提交操作可以同时进行,方法是设置flAllocationType=MEM_RESERVE|MEM_COMMIT 
5.使用MEM_RESET标志可使RAM页面内容无效,防止系统占用已用内存时,把RAM写到硬盘的页文件,因为这个操作会降低系统的运行效率,但是经过我的测试,这个标志只在windows2000下有效,在windows xp 或者win7无效(所以这条可以不考虑)

BOOL VirtualFree( 
LPVOID lpAddress, // 区域地址 
SIZE_T dwSize, // 区域大小,字节 
DWORD dwFreeType // 类型); 
看名字都看得出来,这个函数时释放或者解除虚拟地址到物理存储器的映射 
使用这个函数时只能释放区域的全部内存,但是收回物理存储器时却可不受此限制
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值