Sum*_*uma 6 c c++ memory-management visual-studio-2010 visual-studio
问题与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的文档似乎是错误的,很可能是某些旧版本运行时的遗留物.
归档时间: |
|
查看次数: |
2444 次 |
最近记录: |