如何使用std::allocater来代替realloc

How do I use use std::allocator in place of realloc?

本文关键字:realloc allocater 何使用 std      更新时间:2023-10-16

假设我正在使用std::allocator编写一个自定义向量来包装newdelete

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

假设我正在使用std::allocater编写一个自定义向量来包装new和delete。

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

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