我创建了一个自定义容器类,如下所示:
template <typename T, typename Alloc=std::allocator<T>>
class container {
...
};
要分配内存,我使用std::allocator_traits<Alloc>::allocate(some_size)
。我想我也可以只使用
Alloc::allocate(some_size)
。当我想用
std::allocator_traits<Alloc>::deallocate(...)
或Alloc::deallocate(...)
释放内存时,问题就来了,因为用deallocate
调用的std::allocator_traits
不是静态的,需要传递分配器对象。Alloc::deallocate
可以工作,因为它是静态的。这两种类型的调用分配器函数的区别是什么?为什么
std::alloctor_traits<Alloc>::deallocate(...)
不再是静态的?我的真实代码:
template <typename T, typename Alloc>
ring<T, Alloc>::~ring() {
if (__n_items > 0) {
for(reference item : *this) {
item.~value_type();
}
std::allocator_traits<Alloc>::deallocate(__buffer, __size);
}
}
传递的参数太少会导致分配器实例丢失。 最佳答案
allocate
的deallocate
和allocator_traits
方法都需要一个分配器对象。为标准库容器提供了一个分配器实例来存储和使用(通常,用户依赖于默认构造函数的行为,该行为默认构造这种分配器)。如果希望将容器类与有状态分配器一起使用,则应执行相同的操作;如果您的自定义分配器没有按实例的状态,则可以根据需要默认构造一个。