五千年(敝帚自珍)

主题:【请教】自建memory pool,请问如何管理内存碎片 -- 东方射日

共:💬6 🌺2 新:
全看分页树展 · 主题
家园 【请教】自建memory pool,请问如何管理内存碎片

我们知道系统提供的动态内存分配new-delete; malloc-free,系统会完成内存碎片的整理。

自建的memory pool就要自己进行了。

memory pool重载new,delete,从自建的memory pool中动态分配内存。有可能产生内存碎片

例如new-delete产生了4个50k的fragment,共有200k的free memory,此时allocate 100k的内存会失败

什么算法处理?

我的想法是建立链表,存储pool中的偏移量,size和应用中申请内存的指针的指针。线程idle时进行内存整理,DEFRAGMENT会涉及内存块的移动,就要修改应用中的pointer。 defragment后通过指针的指针修改应用中指针的指向。

问题是重载new,应用中不会传递给我他申请内存的指针:

调用重载new,

void * p =new(size);

我在new中返回一个指针指向pool中。

但是我不知道void **p,无法在链表中存储*p的地址。整理内存时,无法修改应用中的*p的值

我想除非改变new的形式:new(size, **p),但显然不是一个好主意。

诸大侠有什么建议??

全看分页树展 · 主题


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河