2016-08-02 72 views
3

假设我正在使用std::allocator编写自定义矢量来包装newdelete如何使用std :: allocator代替realloc?

当元素的数量超过向量的容量时,我想重新分配缓冲区到更大的值。我可以通过拨打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功能?

+1

_“为什么std :: allocator不提供重新分配函数?”_这在某种程度上在[这个问题]中被覆盖了(http://stackoverflow.com/questions/3105001/why-is-there-no-reallocation -Functionality-在-C-分配器?RQ = 1)。 – ArchbishopOfBanterbury

+0

[FYI] https://isocpp.org/wiki/faq/freestore-mgmt#realloc-and-renew – NathanOliver

+1

@NathanOliver它结束时指出“在C++中,处理重新分配的更好方法是使用标准库容器,如矢量,并让它自然地增长。“,这是这个问题的出发点... ... –

回答

4

比方说,我正在写一个自定义向量使用std :: allocator来包装新的和删除。

在一般情况下(不包括POD的专业化),我认为你不能在任何情况下使用realloc。构造在特定内存位置的任意对象可能具有内部指针,这些内部指针指向与其构建地址相关的非常特定的地址。简单地移动它(以字节复制的方式)可能会破坏不变量。

因此,您提到的替代方法通常是必需的。你将不得不分配一个新的数组,move(或可能甚至copy!)对象到新的位置,然后释放旧数组。当然,这包括不止一个阶段,可能会失败 - 另一个原因,你为什么不能在一般情况下真的reallocate。也许这就是分配器在第一种情况下从未拥有过这种功能的原因 - 对于基于数组的容器,你通常不能真正使用它们(尽管你可能可以将它们用于POD专业化)。

相关问题