我们假设我正在使用std::allocator
撰写自定义向量来包装new
和delete
。
当元素的数量超过向量的容量时,我想将缓冲区重新分配给更大的容量。我可以通过致电realloc()
轻松实现这一目标。我不想这样做,因为我认为分配/解除分配的责任应该存在于分配器中。
然而,看看std::allocator
的界面,我不知道如何进行重新分配。只有以下方法:
T* allocate( std::size_t n );
void deallocate( T* p, std::size_t n );
我应该拨打allocator::allocate
然后allocator::deallocate
而不仅仅是realloc
吗?这有效吗?它必须是std::vector
正在做的事情。为什么std::allocator
没有提供reallocate
功能?
答案 0 :(得分:4)
让我们说我正在使用std :: allocator编写自定义向量来包装new和delete。
在一般情况下(不包括POD的专业化),我认为在任何情况下都不能使用realloc
。在特定存储器位置构造的任意对象可能具有指向与构造它的地址相关的非常特定地址的内部指针。简单地移动它(在字节复制意义上)可以打破不变量。
因此,您提到的替代方案通常是必要的。您必须将新数组move
(或甚至可能copy
!)分配给新位置,然后取消分配旧数组。当然,这包括不止一个可能失败的阶段 - 这也是你在一般情况下不能真正reallocate
的另一个原因。也许这就是分配器在第一种情况下从未拥有此功能的原因 - 对于基于阵列的容器,您通常不能真正使用它们(尽管您可以将它们用于POD专业化)。