【问题标题】:Is memory fragmentation possible when malloc and free functions are called in order?malloc 和 free 函数按顺序调用时是否可能出现内存碎片?
【发布时间】:2013-11-18 17:54:30
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

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

标签: c memory-management embedded malloc free


【解决方案1】:

几乎可以肯定,内存分配器会进行空闲块聚合,这样相邻的空闲块就会聚合成一个块。无法保证这一点,但如果不是必需的行为,那将是常规行为。

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

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

aaaaaaaaaaabbbbbbbbbbbbbbcccccccccccccc

如果你在 a 或 c 之前释放 b,你将有两个不相邻的空闲块,直到 a 或 c 被释放。

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

但是这是学术性的,因为正如我所说,不能保证一开始就分配相邻块。如果您想确定行为,您可以分配一个大块(静态分配或使用 malloc 从堆中分配),然后使用您自己的分配器从该分配器中分配一个满足您应用程序要求的实现。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 2012-04-29
      • 2011-11-28
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多