c - 依次调用malloc和free函数是否会产生内存碎片?

标签 c memory-management embedded malloc free

我正在用 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/

相关文章:

c++ - 堆栈内存未释放

c - Windows 应用程序的 C 内存池(对 C++ 不感兴趣)

c++ - 如何释放 Kiss FFT 分配的内存?

c - 实时时钟、增量并显示在 C 语言的 LED 上

c - 从中断返回后的轻微延迟

c - 我应该如何从 C 程序内部调用外部程序

c - __attribute__ 包含一个整数

c - 使用 while 循环打印每行 10 个字符的 Ascii 表

c - 如何设置指向二维数组的指针

c++ - Windows 与 Linux 内存分配/std::list 构造函数性能