我正在实现一个堆池工具,需要一个 pool_clear() 函数(类似于 Apache Portable Runtime 的 apr_pool_clear())。这个函数允许我们一次性释放该池中分配的所有内存,而不会将内存页释放到底层系统。Windows API 只提供 HeapFree()(多个函数调用)和 HeapDestroy()(释放内存页)。
有没有在 Windows 上实现它的方法(使用本机 API)?
有没有在 Windows 上实现它的方法(使用本机 API)?
HeapCreate
及其他来自Kernel32
的Heap*
函数无法提供此类功能。它们旨在提供与C标准库相同的功能,以及一些额外的调试/诊断功能。
听起来RtlCreateHeap
来自ntdll
会很适合,您可以自己分配内存并指定HeapBase
、InitialCommit
、InitialReserve
和CommitRoutine
。
这意味着您可以调用RtlDestroyHeap
而不会将所有虚拟内存都返回,然后再次调用RtlCreateHeap并使用相同的HeapBase
,从而在相同的虚拟内存中创建一个新堆。
很遗憾,据我所知,ntdll
中的这些入口点是未记录的,大部分本地API也是如此,因此调用它存在风险。链接的文档是驱动程序使用的Ntoskrnl
入口点的文档。既然您明确调用了本地API,也许您理解并接受了这种风险。无论如何,使用已经实现了此功能的库几乎肯定更安全。
如果您真的对这种事情非常认真(说实话,这让我感到害怕),您肯定会想要查看ReactOS的堆实现作为Microsoft文档的补充。
apr_pool_clear
作为类比,这让我相信他想要将内存保留在VirtualAlloc
中,但允许堆重复使用。 - Sean Cline