我有一个用C++实现的树。
当我运行创建树的代码并使用malloc()插入大约5,000,000 int键时,当我使用Visual 2013运行时,它将使用类似于200 as的(如任务管理器所示)。
当我在每个节点上使用free()释放树时,它将返回到0.5MB的周围。到现在为止一切都还好。
现在,当我使用cygwin编译和运行Visual时,树的大小就像80 in (这是可以的,因为visual Studio添加了调试信息和其他东西),,但是当我释放树时,它的大小没有任何变化!
简单地说:在Visual中运行释放树时,将程序的大小返回到原始大小0.5MB,但是当我在Visual之外编译和运行相同的代码(使用cygwin)时,释放树不会从程序大小(仍然是80 of )中改变任何东西。
那为什么会发生这种事?
更新
释放树后,我尝试再次在树中插入相同的5,000,000 int键。在cygwin的情况下,它没有使用额外的内存,即相同的80 to,这意味着,正如反馈所指出的(谢谢各位+1),内存被释放了,但没有返回到操作系统。
现在的问题是:--如果我有大量内存分配,当释放的时候,我不喜欢把这个空闲的区域保留在程序中。那么,我如何让强制 cygwin将其返回到操作系统呢?
发布于 2017-10-01 12:54:04
不同的恶意行为是不同的。Microsoft可以使用原始堆分配和释放项。
看起来MS在直接原始堆(HeapAlloc/HeapFree)上使用内存。
但是cygwin使用的是本地托管内存系统。
这意味着通过HeapAlloc / HeapFree释放内存将返回给操作系统,并释放相关资源。
在cygwin上自由调用,将返回要重用的内存,但不会将其返回给操作系统。
管理大量内存
如果您有大量需要处理的内存,那么您最好直接管理它们,方法是迭代操作系统,并调用它的基本函数。例如,在Windows上,您可以调用HeapCreate来创建一个单独的堆,并使用HeapAlloc在该单独的大型块分配中分配,用HeapFree释放它们。
当您完成该块时,可以使用HeapDestroy释放所有内存。
https://stackoverflow.com/questions/46512510
复制相似问题