在这种情况下是否发生堆碎片?

时间:2012-11-17 12:12:35

标签: c memory heap

在一个有很多迭代的循环中,在循环开始时我会分配一些空间,对它进行处理并在最后解除分配。这样的事情:

....
while(...){
  list=malloc(N);
  do_some_work_with_list(...)
  free(list)
}

这里会发生碎片吗?

PS我已经尝试发布这个问题,但之后找不到,抱歉,如果重复

2 个答案:

答案 0 :(得分:1)

嗯,这取决于。如果没有其他分配发生,则不会发生碎片,因为分配的块将在分配下一个块之前释放。但是,如果do_some_work_with_list分配在返回之前未释放的内存,则会发生碎片 。此外,如果其他线程,库调用等分配可能是碎片。

答案 1 :(得分:0)

它完全取决于平台的内存管理技术(例如,首先分配最大的空闲块优先/最佳空闲块)和堆内存中的当前分配状态。

由于堆是动态内存分配的地方,如果找到足够大的单个块进行分配,则稍后释放内存后不会产生碎片。 如果由于先前堆中存在碎片而未找到单个块,那么这段代码很可能会增加碎片(同时考虑到系统上运行的其他线程可能同时分配内存)。