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