[New - Windows NT]
VirtualFreeEx功能在指定进程的虚拟地址空间内释放,分解或同时释放内存区域。
VirtualFreeEx功能与VirtualFree功能之间的区别在于VirtualFree释放调用进程的地址空间内存,而VirtualFreeEx则可以指定进程。
BOOL VirtualFreeEx(
HANDLE 【hProcess】, | //在其中释放内存的进程 |
LPVOID 【lpAddress】, | //内存区域的起始地址释放 |
DWORD 【的dwSize】, | //大小,以字节为单位的内存区域释放 |
DWORD 【dwFreeType】 | //自由操作的类型 |
); |
参数
【hProcess】
处理过程。该函数释放此进程的虚拟地址空间内存。
您必须具有此进程的PROCESS_VM_OPERATION权限。如果没有,则该函数失败。
【lpAddress】
指向要释放的内存区域的起始地址。
如果在【dwFreeType】参数中设置了MEM_RELEASE标志,则【lpAddress】必须是VirtualAllocEx函数返回的基址,该区域被保留。
【的dwSize】
指定要释放的内存区域的大小(以字节为单位)。
如果在【dwFreeType】参数中设置了MEM_RELEASE标志,则【的dwSize】必须为零。该函数将初始分配调用中保留的整个区域释放到VirtualAllocEx.
如果设置了MEM_DECOMMIT标志,该函数将从【lpAddress】参数到(【lpAddress】 + 【的dwSize】)范围内的所有包含一个或多个字节的存储器页面将被解除。这意味着,例如,跨越页面边界的2字节的存储器区域导致两个页面被分解。
该函数解除VirtualAllocEx保留的整个区域。如果满足以下三个条件:
*设置MEM_DECOMMIT标志
* 【lpAddress】是该区域被保留时由VirtualAllocEx函数返回的基址
* 【的dwSize】为零
整个区域进入保留状态。
【dwFreeType】
一组位标志,指定空闲操作的类型。您必须设置以下两个标志之一:
旗 | 含义 |
MEM_DECOMMIT | 该函数解除指定的页面区域。页面进入保留状态。 |
如果您尝试解除未提交的页面,该函数不会失败。这意味着您可以在不首先确定其当前承诺状态的情况下解除一系列页面。 | |
MEM_RELEASE | 该函数释放指定的页面区域。页面进入空闲状态。 如果指定此标志,则【的dwSize】必须为零,并且【lpAddress】必须指向VirtualAllocEx功能返回的基址,该区域被保留。如果不满足上述任一条件,该函数将失败。 |
如果当前提交了该区域中的任何页面,则该函数首先被解除,然后释放它们。 如果尝试发布不同状态的页面,某些保留和某些提交的页面,该函数不会失败。这意味着您可以在不首先确定其当前承诺状态的情况下发布一系列页面。 |
返回值
如果函数成功,则返回值为非零值。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
进程的虚拟地址空间中的每一页内存都是三种状态之一:
州 | 含义 |
自由 | 页面既不提交也不保留。该进程无法访问该页面。尝试读取或写入免费页面会导致访问冲突异常。 您可以使用VirtualFreeEx功能将保留或提交的内存页面置于空闲状态。 |
保留的 | 页面保留。其他分配功能不能使用地址范围。该页面无法访问,并且没有与之关联的物理存储。尝试读取或写入免费页面会导致访问冲突异常。 您可以使用VirtualFreeEx函数将保留的内存页放入保留状态,并将保留的内存页放入空闲状态。 |
承诺 | 页面已提交。内存中或磁盘上的页面文件中的物理存储被分配给页面,访问由保护代码控制。 只有在首次尝试读取或写入该页面时,操作系统才会将每个已提交的页面初始化并加载到物理内存中。 当进程终止时,操作系统会释放所提供的页面的所有存储空间。 您可以使用VirtualAllocEx函数将保留的内存页放入保留或空闲状态。 |
VirtualFreeEx功能可以执行以下操作:
*取消已提交或未提交的页面的区域。此操作后,页面处于保留状态。
*释放保留页面的区域。此操作后,页面处于空闲状态。
*撤销并释放已提交或未提交的页面的区域。此操作后,页面处于空闲状态。
VirtualFreeEx功能可以解除不同状态的页面范围,一些已提交的页面和一些未提交的页面。这意味着您可以在不首先确定每个页面的当前承诺状态的情况下解除一系列页面。取消页面会在内存中或磁盘上的页面文件中释放物理存储。
如果某个页面已被解除但未被释放,则其状态将更改为保留。您随后可以致电VirtualAllocEx提交,或VirtualFreeEx发布。尝试从保留页面读取或写入会导致访问冲突异常。
VirtualFreeEx功能可以释放不同状态的一些页面,一些保留和一些提交。这意味着您可以在不首先确定每个页面的当前承诺状态的情况下发布一系列页面。最初由VirtualAllocEx功能保留的整个页面范围必须同时释放。
如果页面被释放,其状态将变为空闲状态,并且可用于后续分配操作。尝试读取或写入免费页面会导致访问冲突异常。
也可以看看
GlobalAlloc, GlobalFree, VirtualAlloc, VirtualAllocEx, VirtualFree