VirtualFree功能在调用进程的虚拟地址空间中释放或分解(或两者)一个页面的区域。
BOOL VirtualFree(
LPVOID 【lpAddress】, | //提交的页面的地址 |
DWORD 【的dwSize】, | //区域大小 |
DWORD 【dwFreeType】 | //自由操作的类型 |
); |
参数
【lpAddress】
指向要释放的页面的基地址。如果【dwFreeType】参数包含MEM_RELEASE标志,则当该页面被保留时,此参数必须是VirtualAlloc函数返回的基址。
【的dwSize】
指定要释放的区域的大小(以字节为单位)。如果【dwFreeType】参数包含MEM_RELEASE标志,则此参数必须为零。否则,受影响页面的区域包括从【lpAddress】参数到(【lpAddress】 + 【的dwSize】)范围内的一个或多个字节的所有页面。这意味着跨越页面边界的2字节范围会导致两个页面被释放。
【dwFreeType】
指定空闲操作的类型。可以指定以下标志中的一个但不能同时两个:
旗 | 含义 |
MEM_DECOMMIT | 取消提交的页面的指定区域。 |
尝试解除未提交的页面不会导致该函数失败。这意味着一系列已提交或未提交的页面可以被分解而无需担心失败。 | |
MEM_RELEASE | 释放指定的保留页面区域。如果指定了此标志,则【的dwSize】参数必须为零,否则该函数将失败。 |
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
VirtualFree可以执行以下操作之一:
*取消已提交或未提交的页面的区域。
*释放保留页面的区域。
*撤销并释放已提交或未提交的页面的区域。
要释放页面区域,整个页面范围必须处于相同的状态(全部保留或全部提交),并且必须同时释放原来由VirtualAlloc功能保留的整个区域。如果只保留原始保留区域中的部分页面,则必须首先调用VirtualFree以解除提交的页面,然后再次调用VirtualFree以释放整个块。
已发布的页面可用于后续分配操作。尝试读取或写入免费页面会导致访问冲突异常。
VirtualFree可以解除未提交的页面;这意味着可以分解一系列已提交或未提交的页面,而无需担心失败。取消页面会在内存中或磁盘上的页面文件中释放物理存储。如果某个页面被解除但未被释放,则其状态将更改为保留状态,并且可以通过后续调用VirtualAlloc再次提交该页面。尝试从保留页面读取或写入会导致访问冲突异常。
整个页面范围的当前状态必须与【dwFreeType】参数指定的空闲操作类型兼容。否则,该函数失败,没有页面被释放或分解。
也可以看看