我有一个用C++实现的树。
当我使用malloc()运行创建树和插入5000000个int键的代码时,当我使用Visual Studio 2013运行时需要大约200MB(如任务管理器中所示)。
当我在每个节点上使用free()释放树时,它将返回到大约0.5MB。到现在为止一切都很好。
现在,当我使用cygwin编译并运行完Visual Studio时,树的大小变为80MB(这是可以的,因为visualstudio添加了调试信息和其他东西),但是当我释放树时,树的大小没有任何变化!!!
简而言之:当在Visual Studio中运行时,释放树会将程序的大小返回到原来的0.5MB,但是当我在visualstudio外编译并运行相同的代码(使用cygwin)时,释放树不会改变程序的大小(仍然是80MB)。
为什么会这样?
更新
释放树之后,我尝试再次在树中插入5000000个int键。在cygwin的情况下,它没有使用额外的内存,也就是说,正如反馈指出的那样(感谢各位+1),这意味着内存被释放,但没有返回到操作系统。
现在的问题是:
如果我在内存中有大量的分配,那么当释放时,我不希望将释放的区域保留在程序中。那么,我如何才能强制cygwin将其返回到操作系统?

最佳答案

不同的商场表现不同。Microsoft可以使用原始堆来分配和释放项。
看起来MS正在直接原始堆(HeapAlloc/HeapFree)上使用内存。
但cygwin使用的是本地管理的内存系统。
这意味着通过HeapAlloc/HeapFree释放内存将返回操作系统,并释放相关的资源。
在cygwin上调用free将返回要重用的内存,但不会将其返回给操作系统。
管理大量内存
如果您有大量的内存需要处理,那么最好直接管理它们,方法是使用操作系统并调用其原始函数。例如,在Windows上,可以调用heap create来创建一个单独的堆,并使用HeapAlloc在这个单独的大块分配中进行分配,使用HeapFree释放它们。
当你完成了这个块,所有的内存都可以用HeapDestroy释放。

07-24 09:46
查看更多