我正在学习计算机工程,并且有一些电子类(class)。我从我的两位教授(这些类(class)的教授)那里听说,可以避免使用free()函数(在malloc()calloc()等之后),因为分配的内存空间可能不会再用于分配其他内存。也就是说,例如,如果您分配4个字节然后释放它们,您将有4个字节的空间,可能不会再分配:您将有一个空洞。

我认为这很疯狂:您不能拥有一个非玩具程序,在其中不释放内存就在堆上分配内存。但是我没有足够的知识来解释为什么它如此重要,以至于每个malloc()必须有一个free()

因此:在任何情况下都可以使用malloc()而不使用free()吗?如果没有,我该如何向教授解释?

最佳答案

容易:只需阅读几乎所有严重的malloc()/free()实现的源代码。我的意思是指处理 call 工作的实际memory manager。这可能在运行时库,虚拟机或操作系统中。当然,并非在所有情况下都平等地访问该代码。

通过将相邻的孔连接成更大的孔来确保内存不被分割是非常普遍的。更严格的分配器使用更严格的技术来确保这一点。

因此,假设您进行了三个分配和解除分配,并按以下顺序将块放置在内存中:

+-+-+-+
|A|B|C|
+-+-+-+

各个分配的大小无关紧要。然后您释放第一个和最后一个A和C:
+-+-+-+
| |B| |
+-+-+-+

当您最终释放B时,您(至少从理论上来说)最终会得到:
+-+-+-+
| | | |
+-+-+-+

可以将其碎片化为
+-+-+-+
|     |
+-+-+-+

即单个较大的免费块,不留任何碎片。

引用,根据要求:
  • 尝试阅读dlmalloc的代码。我要先进得多,要实现完整的生产质量。
  • 即使在嵌入式应用程序中,也可以使用碎片整理实现。例如参见these notes on the heap4.c code in FreeRTOS
  • 关于c++ - 在分配的内存上不使用free()是否可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22481134/

    10-11 22:57
    查看更多