首页 > 解决方案 > 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(...)or释放内存时,问题就来了Alloc::deallocate(...),因为deallocate调用 withstd::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);
    }
}

抛出的参数太少会导致缺少分配器实例。

标签: c++containersallocator

解决方案


allocatedeallocate方法都allocator_traits需要一个分配器对象。标准库容器被赋予一个分配器实例来存储和使用(通常用户依赖于默认构造函数行为,默认构造这样的分配器)。如果您希望将容器类与有状态分配器一起使用,您也应该这样做;如果您的自定义分配器没有每个实例的状态,您可以根据需要默认构造一个。


推荐阅读