2

在具有多次迭代的循环中,在循环开始时我分配一些空间,处理它并在最后释放它。像这样的东西:

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

这里会出现碎片吗?

PS我已经尝试发布这个问题,但后来找不到,如果重复,对不起

4

2 回答 2

1

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

于 2012-11-17T12:17:46.960 回答
0

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

由于堆是动态内存分配的地方,如果找到一个足够大的块来分配,那么一旦你以后释放内存就不会造成碎片。如果由于之前堆中存在碎片而没有找到单个块,那么很可能碎片可能会因这段代码而增加(同时考虑到系统上运行的其他线程可能同时分配内存)。

于 2012-11-17T15:52:58.523 回答