我正在学习计算机工程,并且有一些电子类(class)。我从我的两位教授(这些类(class)的教授)那里听说,可以避免使用free()
函数(在malloc()
,calloc()
等之后),因为分配的内存空间可能不会再用于分配其他内存。也就是说,例如,如果您分配4个字节然后释放它们,您将有4个字节的空间,可能不会再分配:您将有一个空洞。
我认为这很疯狂:您不能拥有一个非玩具程序,在其中不释放内存就在堆上分配内存。但是我没有足够的知识来解释为什么它如此重要,以至于每个malloc()
必须有一个free()
。
因此:在任何情况下都可以使用malloc()
而不使用free()
吗?如果没有,我该如何向教授解释?
最佳答案
容易:只需阅读几乎所有严重的malloc()/free()
实现的源代码。我的意思是指处理 call 工作的实际memory manager。这可能在运行时库,虚拟机或操作系统中。当然,并非在所有情况下都平等地访问该代码。
通过将相邻的孔连接成更大的孔来确保内存不被分割是非常普遍的。更严格的分配器使用更严格的技术来确保这一点。
因此,假设您进行了三个分配和解除分配,并按以下顺序将块放置在内存中:
+-+-+-+
|A|B|C|
+-+-+-+
各个分配的大小无关紧要。然后您释放第一个和最后一个A和C:
+-+-+-+
| |B| |
+-+-+-+
当您最终释放B时,您(至少从理论上来说)最终会得到:
+-+-+-+
| | | |
+-+-+-+
可以将其碎片化为
+-+-+-+
| |
+-+-+-+
即单个较大的免费块,不留任何碎片。
引用,根据要求:
heap4.c
code in FreeRTOS。 关于c++ - 在分配的内存上不使用free()是否可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22481134/