C ++如何在自定义容器中正确调用deallocate

问题描述

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

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