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

当按顺序调用malloc和free函数时,内存碎片是否可能?,c,memory-management,embedded,malloc,free,C,Memory Management,Embedded,Malloc,Free,我正在用C语言做一个嵌入式系统应用程序,我想知道以下几点。 如果按顺序使用malloc和free函数,您还需要担心内存碎片吗 例如: 马洛克(a) 马洛克(b) 马洛克(c) 免费(c) 免费(b) 免费(a) 谢谢您的帮助。在您的情况下,您不应该看到内存碎片发生。您可以通过多次执行malloc/free序列(比如1000次)来验证它是否没有发生。如果malloc为a、b和c返回相同的值,那么我认为您可以断定没有发生碎片。几乎可以肯定的是,内存分配器将执行空闲块聚合,因此相邻的空闲块将聚合为单个

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

例如: 马洛克(a) 马洛克(b) 马洛克(c) 免费(c) 免费(b) 免费(a)


谢谢您的帮助。

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

几乎可以肯定的是,内存分配器将执行空闲块聚合,因此相邻的空闲块将聚合为单个块。这一点无法保证,但如果不要求行为,这将是常规行为

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

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

aaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc
在a或c之前释放b,将有两个非相邻的空闲块,直到a或c释放为止

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

然而,这是学术性的,因为正如我所说,没有保证在第一时间分配相邻的街区。如果您想确定其行为,可以分配一个大数据块(静态分配或使用malloc从堆中分配),然后使用自己的分配器从中分配满足应用程序要求的实现。

询问内存管理器。您的里程数可能会有所不同。这取决于您正在使用的malloc库使用的方案。如果这真的是您的用法,那么您可以编写一个完美的内存分配器。如果在给定此模式时要求内存分配器无碎片,那么请编写一个具有该属性的内存分配器。然后你就会知道你的问题的答案。任何超过一个线程和。。。