让我们说,为了问题的目的,我们有一个内存池,它最初分配了 n 块。但是,当达到容量时,池希望增长并变为其大小的两倍( 2n )。
现在可以使用C中的realloc
来完成此调整大小操作,但是函数本身可能会返回指向不同内存的指针(复制旧数据)。
这意味着内存池分配器返回的指针可能不再有效(因为内存可能已经移动了)。
克服这个问题的好方法是什么?或者甚至可能吗?
答案 0 :(得分:4)
分配多个不连续的内存池。当一个池已满时,分配第二个池,允许它在虚拟地址空间中的其他位置。
然后问题是跟踪你的游泳池在哪里。通常,您会使用每个池中的一些空间进行簿记。例如,您可以保留一个指针的空间值来保留所有池的简单线性链接列表。更复杂的分配器往往需要更多的簿记开销。
答案 1 :(得分:1)
而不是使用realloc,malloc一个新的/额外的块块(假设没有理由为你的池分配器管理和返回并返回的块需要在一个连续的内存块中)。< / p>