2

假设,出于问题的目的,我们有一个内存池,最初分配了n个块。但是,当达到容量时,池想要增长并变成原来的两倍(2n)。

现在这个调整大小操作可以realloc在 C 中完成,但是函数本身可能会返回一个指向不同内存的指针(其中复制了旧数据)。

这意味着内存池分配器返回的指针可能不再有效(因为内存可能已被移动)。

什么是克服这个问题的好方法?或者甚至有可能吗?

4

2 回答 2

4

从多个不连续的内存池中分配。当一个池已满时,分配第二个池,使其位于您的虚拟地址空间中的其他位置。

然后问题是跟踪您的池在哪里。通常,您会使用每个池中的一些空间进行簿记。例如,您可以保留一个指针的空间来保存所有池的简单线性链表。更复杂的分配器往往需要更多的簿记开销。

于 2012-11-13T00:06:55.060 回答
1

不是使用 realloc,而是 malloc 一个新的/额外的块块(假设没有理由为什么由池分配器管理、返回和返回的块需要位于单个连续的内存块中)。

于 2012-11-13T00:07:31.990 回答