我在c ++中有一些代码用于分配内存并释放它,尽管RAM不会立即清除...我的疑问是(我正在使用linux OS)
1)操作系统是否需要时间来释放已释放的内存?
2)如何强制RAM在一定时间间隔内清除释放的内存?
谢谢
答案 0 :(得分:2)
释放内存的主题比您预期的要复杂。 whole articles致力于分配和解除分配政策。
通常,大块分配有mmap
(内存映射文件),它立即随free
释放。小块内存是从大块中切出的堆的大小,其大小由sbrk
系列函数管理。
释放大堆中的内存通常是通过将释放的块放入空闲列表(或类似列表)中来完成的。空闲列表由C库管理,内核无法通过sbrk释放它。该过程将无限期保留释放的块。
有时,堆的末尾有一个连续的内存区域在空闲列表中。在这种情况下,C库可能决定收缩堆,然后将内存返回给操作系统。这是很少见的情况,因为在堆的末尾只有一小块内存足以防止发生这种情况,这已经足够了。
在Linux上检查mallopt,以了解如何控制free
发布策略的积极性。请注意,此调用不可移植,并且会从一个操作系统更改为另一个操作系统。同样,malloc_trim(0)
是一种非便携式的,仅用于Linux的方法,用于强制C库将所有可能的内存返回给OS。很有可能,您的操作系统在相同的目的上也有类似的不可移植的调用。
通常,中小块的内存永远不会返回到操作系统,并在整个进程的生命周期内都保存在内部空闲列表中。下次调用malloc通常会从此空闲列表中分配内存。
强制释放内存的唯一方法是直接对其进行管理,从而完全避免了malloc / free。您可以通过mmap分配很大的内存,然后在完成后取消映射。使用stock malloc / free很难确保在LIFO(后进先出)中完成分配(和释放),否则将有一小块内存妨碍向操作系统释放内存。
操作系统之间的详细信息有所不同。 Windows和POSIX系统具有不同的策略和不同的内存映射原语。在没有虚拟内存的OS(例如DOS)上,所有内存都可以立即返回到OS(没有mmap或sbrk)。