如何使用std::allocater来代替realloc
How do I use use std::allocator in place of realloc?
假设我正在使用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
功能?
假设我正在使用std::allocater编写一个自定义向量来包装new和delete。
在一般情况下(不包括POD的专业化),我认为在任何情况下都不能使用realloc
。在特定内存位置构造的任意对象可能具有指向与构造该对象的地址相关的非常特定地址的内部指针。简单地移动它(在字节复制的意义上)可能会破坏不变量。
因此,你提到的替代方案通常是必要的。您必须将一个新数组move
(甚至可能是copy
!)对象分配到新位置,然后取消分配旧数组。当然,这包括不止一个可能失败的阶段——这也是为什么在一般情况下不能真正reallocate
的另一个原因。也许这就是分配器在第一种情况下从未具有此功能的原因——对于基于数组的容器,通常不能真正使用它们(尽管您可能可以将它们用于POD专用化)。
相关文章:
- Realloc 两次无法在 Visual Studio 上运行
- Google Sparsehash 在类型上使用 realloc(),这很难复制
- 使用new时如何重新分配dyyanmic数组,不使用realloc删除C++?
- 在C++"new"运算符之后使用"realloc"是否安全?
- C++malloc/realloc的奇怪行为
- 无论如何如何重新分配内存,即使 realloc() 在 c++ 中失败
- 为什么我得到 realloc() 无效的旧大小
- Realloc char* 内部结构
- Realloc 调整大小数组
- 使用(以及)realloc调用Constuctor
- Realloc():即使使用malloc()分配内存,旧大小也无效
- 带有realloc的自定义池内存分配器
- 如果Malloc无法分配X字节,我应该使用Realloc还是再次使用Malloc?C++
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- c++ realloc performance vs malloc
- realloc而不释放旧内存
- 实现 realloc 的独立库
- 如果正在缩小已分配的内存大小,请同时检查realloc()
- 为什么在realloc之后字符串在内存中变得无效
- 如何使用std::allocater来代替realloc