Winapi 释放Windows堆而不释放内存页

Winapi 释放Windows堆而不释放内存页,winapi,heap-memory,Winapi,Heap Memory,我正在实现一个堆池实用程序,我需要一个pool\u clear()函数(比如Apache便携式运行时apr\u pool\u clear()。此函数允许我们立即释放(单个函数调用)该池上分配的所有内存,而无需向底层系统释放内存页。Windows API仅提供HeapFree()(多个函数调用)和HeapDestroy()(释放内存页) 在Windows上(使用本机API)有什么方法可以做到这一点吗?和Kernel32中的其他函数不提供这种功能。它们旨在提供与C标准库相同的功能,以及一些额外的调试

我正在实现一个堆池实用程序,我需要一个pool\u clear()函数(比如Apache便携式运行时apr\u pool\u clear()。此函数允许我们立即释放(单个函数调用)该池上分配的所有内存,而无需向底层系统释放内存页。Windows API仅提供HeapFree()(多个函数调用)和HeapDestroy()(释放内存页)

在Windows上(使用本机API)有什么方法可以做到这一点吗?

Kernel32
中的其他函数不提供这种功能。它们旨在提供与C标准库相同的功能,以及一些额外的调试/诊断功能

这听起来像是从
ntdll
来的,可以自己分配内存并指定
HeapBase
InitialCommit
InitialReserve
CommitRoutine

这意味着您可以调用
RtlDestroyHeap
,而不返回所有虚拟内存,然后使用相同的
HeapBase
再次调用RtlCreateHeap,有效地在同一虚拟内存中创建新堆

不幸的是,据我所知,
ntdll
中的这些入口点是未记录的,因此调用它存在风险。链接文档用于
Ntoskrnl
中的入口点,供驾驶员使用。因为您使用本机API显式调用,所以您可能理解并接受这种风险。在任何情况下,使用已经实现此功能的库几乎肯定会更安全


如果你真的对这类事情很认真(坦率地说,这让我很害怕),你肯定会想把它作为微软文档的补充。

使用NTDLL没有实际风险,正如微软希望人们相信的那样。使用windows的未记录功能的实际风险是真实的:没有人保证该功能在未来版本中仍然可用(并且具有相同的功能)。这似乎是直接使用windows本机API的唯一方法。这不是好消息,但我会接受它作为正确的答案。我必须使用VirtualAlloc、VirtualFree和自定义分配器来实现它。谢谢。“免费”是指“取消物理页的提交”,还是指“堆管理器将其标记为未使用,但保持物理页的提交”?(请注意,“release”与这两者不同,它释放虚拟地址空间和物理内存。)@Mehrdad,OP用作模拟,这让我相信他希望留下内存
VirtualAlloc
,但允许堆重用。你不使用VirtualAlloc等吗?为此,我使用HeapCreate创建堆,并使用HeapAlloc和HeapFree。我想要的是一种方法,可以一次HeapFree所有由HeapAlloc分配的内存块,而不调用HeapDestroy(我想重用该堆)。这就是你的问题。你需要更多的控制。使用VirtualAlloc等。