在一个有很多迭代的循环中,在循环开始时我会分配一些空间,对它进行处理并在最后解除分配。这样的事情:
....
while(...){
list=malloc(N);
do_some_work_with_list(...)
free(list)
}
这里会发生碎片吗?
PS我已经尝试发布这个问题,但之后找不到,抱歉,如果重复
答案 0 :(得分:1)
嗯,这取决于。如果没有其他分配发生,则不会发生碎片,因为分配的块将在分配下一个块之前释放。但是,如果do_some_work_with_list
分配在返回之前未释放的内存,则会发生碎片 。此外,如果其他线程,库调用等分配可能是碎片。
答案 1 :(得分:0)
它完全取决于平台的内存管理技术(例如,首先分配最大的空闲块优先/最佳空闲块)和堆内存中的当前分配状态。
由于堆是动态内存分配的地方,如果找到足够大的单个块进行分配,则稍后释放内存后不会产生碎片。 如果由于先前堆中存在碎片而未找到单个块,那么这段代码很可能会增加碎片(同时考虑到系统上运行的其他线程可能同时分配内存)。