1 普通内存分配方式的缺点以及解决方法:
1.1 普通的动态内存分配方式(如c语言运行库的内存分配malloc、free):
分配时,是在堆的空闲链表上,查找到第一块空闲的并且足够大的内存,然后对这块内存进行分割,分割一块足够的内存给调用者,剩余部分作为一个新的节点链接到空闲链表里面去;释放时,查找与被释放内存区域连续的节点,如有找到,则合并,如无,则作为一个新的节点放回空闲链表里面去。
1.2 普通的动态内存分配缺点:
多次分配、释放内存操作后,可能会产生大量的外部碎片(下面红色表示已分配的内存块,绿色表示空闲的内存块)。
例如,经过多次分配后,内存块分布如下所示:
|-------------------------------------------------------------------|------|-------------------------------------------------------------------|------|-------------------------------------------------------------------|
然后有部分内存被释放了,内存块如下所示:
|-------------------------------------------------------------------|------|-------------------------------------------------------------------|------|-------------------------------------------------------------------|