问题描述
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
的{{1}}和deallocate
方法都需要一个分配器对象。为标准库容器提供了一个分配器实例来存储和使用(通常,用户依赖于默认构造函数的行为,该行为默认构造这种分配器)。如果希望将容器类与有状态分配器一起使用,则应执行相同的操作;如果您的自定义分配器没有按实例的状态,则可以根据需要默认构造一个。