我正在用 C 语言做一个嵌入式系统应用程序,我想知道以下内容。 如果按顺序使用malloc和free函数,还需要担心内存碎片吗?
示例: malloc(一) 内存分配(b) malloc(c) 免费(c) 免费(b) 免费(一)
感谢您的帮助。
最佳答案
几乎可以肯定的是,内存分配器将执行空闲 block 聚合,从而将相邻的空闲 block 聚合成单个 block 。无法保证这一点,但如果不是必需的行为,这将是常规行为。
当然不能保证示例中的 block a、b 和 c 是相邻的,但无论哪种方式,在释放所有三个 block 时,堆将处于与之前相同的状态 分配,从这个意义上说,释放的顺序实际上没有区别。
只有中间状态才会被碎片化。例如,如果 block 如下相邻:
aaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc
如果您在 a 或 c 之前释放 b,您将拥有两个不相邻的空闲 block ,直到 a 或 c 被释放为止。
aaaaaaaaaaa--------------cccccccccccccc
然而,这是学术性的,因为正如我所说,首先不能保证相邻 block 的分配。如果您想确定该行为,您可以分配一个大块(静态地或使用 malloc 从堆中分配),然后使用您自己的分配器以及满足您的应用程序要求的实现从该 block 中进行分配。
关于c - 依次调用malloc和free函数是否会产生内存碎片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054436/