很多人的印象似乎是,一旦释放内存,它就会立即返回操作系统并可供其他程序使用。
这不是真的。操作系统通常以 4KiB 页面管理内存。malloc
和其他类型的内存管理从操作系统获取页面并在他们认为合适的时候对它们进行子管理。假设您的程序稍后会分配更多内存,则很可能free()
不会将页面返回给操作系统。
我并不是说free()
永远不会将内存返回给操作系统。它可能会发生,尤其是当您释放大量内存时。但不能保证。
重要的事实:如果您不释放不再需要的内存,则可以保证进一步的 malloc 会消耗更多的内存。但是如果你先释放,malloc 可能会重新使用释放的内存。
这在实践中意味着什么?这意味着如果您知道您的程序从现在开始不再需要任何内存(例如,它处于清理阶段),那么释放内存就不是那么重要了。但是,如果程序稍后可能会分配更多内存,则应避免内存泄漏——尤其是可能重复发生的内存泄漏。
另请参阅此评论以获取有关为什么在终止前释放内存不好的更多详细信息。
评论者似乎不明白调用free()
不会自动允许其他程序使用释放的内存。但这就是这个答案的全部意义!
所以,为了说服人们,我将展示一个 free() 没有什么好处的例子。为了使数学易于理解,我将假设操作系统管理 4000 字节页面中的内存。
假设您分配了一万个 100 字节的块(为简单起见,我将忽略管理这些分配所需的额外内存)。这会消耗 1MB 或 250 页。如果您随后随机释放 9000 个这些块,那么您只剩下 1000 个块 - 但它们分散在各处。据统计,大约有 5 个页面是空的。其他 245 个将每个都至少有一个分配的块。这相当于 980KB 的内存,操作系统不可能回收 - 即使您现在只分配了 100KB!
另一方面,您现在可以 malloc() 再增加 9000 个块,而不会增加程序占用的内存量。
即使在技术上free()
可以将内存返回给操作系统,它也可能不会这样做。需要在快速运行和节省内存之间取得平衡。此外,一个已经分配了大量内存然后释放它的程序很可能会再次这样做。Web 服务器需要在一个又一个请求后处理请求 - 保持一些“松弛”内存可用是有意义的,这样您就不需要一直向操作系统询问内存。free()