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