free()
函数(在使用malloc()
、calloc()
等之后),因为分配的内存空间可能不会再被用来分配其他内存。 也就是说,例如,如果您分配了4个字节,然后释放了它们,您将有一个不太可能再次分配的4个字节的空间:您将拥有一个“空洞”。我认为这很疯狂:你不能有一个真正的程序,在堆上分配内存而不释放它。但是我没有足够的知识来解释为什么对于每个
malloc()
都必须有一个free()
是如此重要。那么,是否有情况可以在不使用
free()
的情况下使用malloc()
?如果没有,我该如何向我的教授解释?答:一般情况下,每个
malloc()
都必须有一个相应的free()
来释放已分配的内存,否则会导致内存泄漏。在某些情况下,比如在进程结束时,操作系统会自动回收堆上的内存,但这并不是一个可靠的做法。因此,为了确保程序的正确性和健壮性,在堆上分配内存后必须使用free()
释放它们。
free()
不会将内存返回给操作系统,但仍会标记为malloc()
重用。这将推迟对mmap()/sbrk()
的未来调用,并节省系统内存。一旦整个页面未使用,它们将被分页。然而,长期运行的进程应该解决这个问题并实际将内存返回给操作系统(使用mmap()
比brk()
更容易,但重新启动进程要容易得多)。这就是开发和运营需要理解其影响的地方。 - Henk Langeveld