在具有多次迭代的循环中,在循环开始时我分配一些空间,处理它并在最后释放它。像这样的东西:
....
while(...){
list=malloc(N);
do_some_work_with_list(...)
free(list)
}
这里会出现碎片吗?
PS我已经尝试发布这个问题,但后来找不到,如果重复,对不起
在具有多次迭代的循环中,在循环开始时我分配一些空间,处理它并在最后释放它。像这样的东西:
....
while(...){
list=malloc(N);
do_some_work_with_list(...)
free(list)
}
这里会出现碎片吗?
PS我已经尝试发布这个问题,但后来找不到,如果重复,对不起
这得看情况。如果没有其他分配发生,也不会发生碎片,因为分配的块将在分配下一个块之前被释放。但是,如果do_some_work_with_list
分配在返回之前未释放的内存,则可能会发生碎片。此外,如果分配了其他线程、库调用等,则可能存在碎片。
这将完全取决于平台的内存管理技术(例如,首先分配最大的空闲块/最适合的空闲块)和堆内存中的当前分配状态。
由于堆是动态内存分配的地方,如果找到一个足够大的块来分配,那么一旦你以后释放内存就不会造成碎片。如果由于之前堆中存在碎片而没有找到单个块,那么很可能碎片可能会因这段代码而增加(同时考虑到系统上运行的其他线程可能同时分配内存)。