c-当malloc和free函数按顺序调用时,内存碎片是否可能



我正在用C做一个嵌入式系统应用程序,我想知道以下内容。如果按顺序使用malloc和free函数,你还需要担心内存碎片吗?

示例:malloc(a)malloc(b)malloc(c)免费(c)免费(b)免费

谢谢你的帮助。

几乎可以肯定的是,内存分配器将执行空闲块聚合,从而将相邻的空闲块聚合为单个块。这是无法保证的,但如果不是必要的行为,这将是传统的。

当然,不能保证您的示例中的块a、b和c是相邻的,但无论哪种方式,在释放这三个块时,堆都将处于与分配前相同的状态,从这个意义上说,释放的顺序实际上没有什么区别。

只有中间状态才会被分割。例如,如果区块相邻如下:

aaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc

如果您在a或c之前解除分配b,那么您将有两个不相邻的空闲块,直到a或c被解除分配。

aaaaaaaaaaa--------------cccccccccccccc

然而,这是学术性的,因为正如我所说,首先并不能保证相邻街区的分配。如果您想确定行为,您可以分配一个大块(静态地或使用malloc从堆中分配),然后使用您自己的分配器(具有满足应用程序需求的实现)从中分配。

在您的情况下,您不应该看到内存碎片的发生。您可以通过多次执行malloc/free序列来验证它是否发生,比如1000。如果malloc为a、b和c返回相同的值,那么我认为您可以得出这样的结论:没有发生碎片。

最新更新