std :: list对其allocator参数做了什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: list对其allocator参数做了什么?相关的知识,希望对你有一定的参考价值。

std::list由分配器类型参数化,它可能会重新绑定以分配列表节点而不是Ts。那么它对传递给构造函数的allocator类型的对象有什么作用呢?

template <class T, class Alloc = std::allocator<T>>
class list
{
    class node { ... T element; ... };

    using real_alloc =
        typename std::allocator_traits<Alloc>::template rebind_alloc<node>;
    real_alloc m_allocator;

public:
    list(const Alloc&);
};

在上面的代码中,我们需要将m_allocator初始化为节点分配器,但构造函数被赋予了T分配器。我们只是把T分配器放在地板上,还是以某种方式使用它?

答案

因为C++11分配器可以是有状态的。您希望使用用户提供的内部分配器构建内部分配器。 Allocator显然需要从typename std::allocator_traits<Alloc>::template rebind_alloc<U>构建。

列表构造函数的实现应如下所示:

template<class T, class Alloc>
class list
{
      struct node_type {/*etc*/}; //internal
      using allocator_type_internal = typename std::allocator_traits<Alloc>::template rebind_alloc<node_type>;
      // etc.
      allocator_type_internal m_allocator; //Note we use allocator_type, not Alloc.
};

list::list(const Alloc& alloc ) : 
     m_allocator(alloc)
{ /* initialize sentinel node, etc. */ }

虽然好的实现会对分配器使用空基优化。

另一答案

T分配器仍然用于construct()destroy()内部节点的T部分。使用这些操作可能是在构造期间添加自定义参数所必需的,例如,可选地将合适的分配器参数转发给构造的对象。

以上是关于std :: list对其allocator参数做了什么?的主要内容,如果未能解决你的问题,请参考以下文章

一段时间后得到 std::bad_alloc

std::list 源代码解析

错误:内存位置 0x0038fd50 处的 std::bad_alloc

cpp►STL容器->序列容器->list

StarRocks BE节点崩溃原因查找及解决思路:std::bad_alloc

多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]