我创建了一个自定义容器类,如下所示:

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);
    }
}
传递的参数太少会导致分配器实例丢失。

最佳答案

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

10-08 09:17