2012-11-17 29 views
2

在一个有许多迭代的循环中,在循环的开始处我分配一些空间,在其上进行操作并在最后释放它。类似的东西:在这种情况下发生堆碎片?

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

这里会发生碎片吗?

PS我已经尝试后这个问题,但事后如果重复

+0

欢迎来到本网站!请不要在问题中发布您的电子邮件。 – dasblinkenlight

+0

@ user1523271:http://webdocs.cs.ualberta.ca/~holte/T26/dyn-mem-alloc.html –

回答

1

嘛找不到它,对不起,这要看情况。如果没有其他分配发生,则不会发生分片,因为分配的块将在分配下一个块之前被释放。但是,如果do_some_work_with_list分配的内存在返回之前未释放,则可能会发生分段。另外如果其他线程,库调用等在那里分配可能被分割。

+0

'如果没有其他分配发生,则不会发生分段,因为分块将由分配器合并。我认为应该在答案中明确提到 – Cratylus

+0

谢谢,更新的答案。 – harald

0

这完全取决于平台的内存管理技术(如分配最大的空闲块第一个/最适合的空闲块)以及堆内存中当前的分配状态。

由于堆是动态内存分配的地方,如果发现足够大的单个块用于分配,那么一旦您稍后释放内存,就不会导致碎片。 如果之前由于堆中存在碎片而未找到单个块,那么通过这段代码(也考虑到系统上运行的其他线程可能同时分配内存),最可能的碎片可能会增加。