我正在实现堆池实用程序,我需要一个pool_clear()函数(如Apache Portable Runtime apr_pool_clear())。此函数允许我们立即释放(单个函数调用)该池上分配的所有内存,而不释放内存页面到底层系统。 Windows API仅提供HeapFree()(多个函数调用)和HeapDestroy()(释放内存页面)。
有没有办法在Windows上使用(使用本机API)?
来自HeapCreate
的Heap*
和其他Kernel32
函数不提供这种能力。它们旨在提供与C标准库相同的功能,以及一些额外的调试/诊断功能。
这听起来像RtlCreateHeap
的ntdll
符合条例草案,自己分配记忆并指定HeapBase
,InitialCommit
,InitialReserve
和CommitRoutine
。
这意味着您可以调用RtlDestroyHeap
而不返回所有虚拟内存,然后使用相同的HeapBase
再次调用RtlCreateHeap,有效地在同一虚拟内存中创建一个新堆
不幸的是,据我所知,ntdll
中的这些切入点是无证的,as is most of the Native API,因此存在与调用它相关的风险。链接的文档是Ntoskrnl
中的入口点,供驱动程序使用。由于您使用Native API明确调用,可能您理解并接受此类风险。无论如何,使用已经实现此功能的库几乎肯定会更安全。
如果你真的认真对待这类事情(坦白说,让我感到害怕),你肯定希望将ReactOS's heap implementation作为微软文档的补充。