释放Windows堆而不释放内存页

时间:2014-06-26 00:04:04

标签: winapi heap-memory

我正在实现堆池实用程序,我需要一个 pool_clear()函数(如Apache Portable Runtime apr_pool_clear())。此函数允许我们立即释放(单个函数调用)该池上分配的所有内存,而不释放内存页面到底层系统。 Windows API仅提供 HeapFree()(多个函数调用)和 HeapDestroy()(释放内存页面)。

有没有办法在Windows上使用(使用本机API)?

1 个答案:

答案 0 :(得分:1)

来自Kernel32

HeapCreate和其他Heap*函数不提供此类权力。它们旨在提供与C标准库相同的功能,以及一些额外的调试/诊断功能。

听起来ntdll的{​​{3}}符合条款,自行分配内存并指定HeapBaseInitialCommitInitialReserve和{{ 1}}。

这意味着您可以在没有回放所有虚拟内存的情况下调用CommitRoutine,然后使用相同的RtlDestroyHeap再次调用RtlCreateHeap,有效地在同一虚拟内存中创建一个新堆< / p>

不幸的是,据我所知,HeapBase中的这些入口点是无证件RtlCreateHeap,因此存在与调用它相关的风险。链接的文档用于ntdll中的入口点,供驱动程序使用。由于您使用Native API明确调用,可能您理解并接受此类风险。无论如何,使用已实现此功能的库几乎肯定会更安全。

如果你对这类事情非常认真(坦率地说,让我感到害怕),你肯定希望将as is most of the Native API作为微软文档的补充。

相关问题