c++ - 我如何使用 std::allocator 代替 realloc?

标签 c++ memory-management vector realloc allocator

<分区>

假设我正在使用 std::allocator 编写自定义 vector 来包装 newdelete

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

最佳答案

Let's say I'm writing a custom vector using the std::allocator to wrap new and delete.

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

因此,您提到的替代方案通常是必要的。您必须分配一个新数组,移动(甚至可能复制!)对象到新位置,然后释放旧数组。当然,这包括不止一个可能失败的阶段 - 在一般情况下您不能真正重新分配的另一个原因。也许这就是分配器在第一种情况下从未具有此功能的原因 - 对于基于数组的容器,您一般不能真正使用它们(尽管您可能能够将它们用于 POD 特化)。

关于c++ - 我如何使用 std::allocator 代替 realloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38726544/

相关文章:

c++ - 数据成员/代码指针偏移量

c# - PDFViewCtrl 未处理

ios - Unowned 引用在取消初始化时是否设置为 'nil'?

iphone - 释放 ABMultiValueRef 对象

r - 如何将 "jitter"转换为数字向量?

c++ - 从任意目录加载特定文件?

c++ - 如何更正类型对象错误

c++ - 为什么嵌入式 C++ 编译器不支持异常?

c - 如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)?

c++ - 在两个类实例之间共享 vector