释放Windows堆而不释放内存页

问题描述 投票:3回答:1

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

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

winapi heap-memory
1个回答
1
投票

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

这听起来像RtlCreateHeapntdll符合条例草案,自己分配记忆并指定HeapBaseInitialCommitInitialReserveCommitRoutine

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

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

如果你真的认真对待这类事情(坦白说,让我感到害怕),你肯定希望将ReactOS's heap implementation作为微软文档的补充。

© www.soinside.com 2019 - 2024. All rights reserved.