Visual C ++运行时malloc / free会将内存返回给操作系统吗?

问题与Will malloc实现将free-ed内存返回系统有很多相似之处? ,但我对Windows / Microsoft Visual Studio的答案以及有关确切虚拟内存状态的详细信息感兴趣。

Visual C ++ CRT会自由地将内存返回给系统吗? 关于虚拟内存分配的内存的确切状态是什么? 在大内存块上释放后,块中的内存是否会被提交,保留或释放? 如果我在免费后拨打_heapmin怎么办?

检查2010年的源代码,可以看到malloc / free直接调用HeapAlloc / HeapFree Win32 API函数,将_crtheap作为运行时创建的堆。 因此,VS 2010和最近的Windows版本(Win2000,WinXP,Vista,Win 7)的答案是:

free返回的内存返回给操作系统,但它仍然保持提交状态。

堆函数文档说明如何处理内存承诺:

HeapCreate函数创建一个私有堆对象,调用进程可以使用HeapAlloc函数从该对象分配内存块。 …如果HeapAlloc的请求超过已提交页面的当前大小(假设其物理存储可用),则会自动从此保留空间提交其他页面。 提交页面后,在进程终止之前或者通过调用HeapDestroy函数销毁堆之前,不会解除它们。

此外, HeapCreate文档说明了关于没有设置最大大小的堆的情况:

如果dwMaximumSize为0,则堆的大小可能会增大。 堆的大小仅受可用内存的限制。 分配大于固定大小堆限制的内存块的请求不会自动失败; 相反,系统调用VirtualAlloc函数以获取大块所需的内存。 需要分配大内存块的应用程序应将dwMaximumSize设置为0。

我没有找到任何可以说明使用VirtualAlloc分配的块是否在发布时以特殊方式处理的东西,可能需要进行实验才能知道这一点。

至于_heapmin ,VS 2010没有任何作用,因为它只调用HeapCompact并且CRT堆在自由关闭时没有自动合并。 因此,_heapmin的文档似乎是错误的,很可能是某些旧版本运行时的遗留物。

不,它不会将内存返回“系统”。 _heapmin只释放空白的整个页面,并且通常影响不大。 它不会在页面之间随机播放数据。 因此,它取决于释放堆内存的位置,free()和_heapmin的组合是否会实际减少使用中的页数。 另请注意,VS使用不同的堆进行调试和发布。

有关更多控制,请参阅HeapCreate()/ HeapAlloc()等API。