Namespaces
Variants

std:: allocator

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <memory>
template < class T >
struct allocator ;
(1)
template <>
struct allocator < void > ;
(2) (устарело в C++17)
(удалено в C++20)

Класс-шаблон std::allocator является стандартным Allокатором , используемым всеми контейнерами стандартной библиотеки, если пользовательский аллокатор не указан. Стандартный аллокатор не имеет состояния, то есть все экземпляры данного аллокатора взаимозаменяемы, сравнимы между собой и могут освобождать память, выделенную любым другим экземпляром того же типа аллокатора.

Явная специализация для void не содержит typedef-члены reference , const_reference , size_type и difference_type . Данная специализация не объявляет функций-членов.

(until C++20)

Стандартный аллокатор удовлетворяет требованиям полноты аллокатора .

(начиная с C++17)

Содержание

Типы членов

Тип Определение
value_type T
pointer (устарело в C++17) (удалено в C++20) T*
const_pointer (устарело в C++17) (удалено в C++20) const T *
reference (устарело в C++17) (удалено в C++20) T&
const_reference (устарело в C++17) (удалено в C++20) const T &
size_type std::size_t
difference_type std::ptrdiff_t
propagate_on_container_move_assignment (C++11) std::true_type
rebind (устарело в C++17) (удалено в C++20) template < class U >

struct rebind
{
typedef allocator < U > other ;
} ;

is_always_equal (C++11) (устарело в C++23) (удалено в C++26) std::true_type

Функции-члены

создает новый экземпляр аллокатора
(public member function)
уничтожает экземпляр аллокатора
(public member function)
(until C++20)
получает адрес объекта, даже если operator & перегружен
(public member function)
выделяет неинициализированную память
(public member function)
выделяет неинициализированную память размером не менее запрошенного
(public member function)
освобождает память
(public member function)
(until C++20)
возвращает максимальный поддерживаемый размер выделения
(public member function)
(until C++20)
создает объект в выделенной памяти
(public member function)
(until C++20)
уничтожает объект в выделенной памяти
(public member function)

Функции, не являющиеся членами класса

(removed in C++20)
сравнивает экземпляры аллокаторов
(публичная функция-член)

Примечания

Шаблонный класс-член rebind предоставляет способ получения аллокатора для другого типа. Например, std:: list < T, A > аллоцирует узлы некоторого внутреннего типа Node<T> , используя аллокатор A::rebind<Node<T>>::other (до C++11) std:: allocator_traits < A > :: rebind_alloc < Node < T >> , который реализован через A::rebind<Node<T>>::other если A является std::allocator (начиная с C++11) .

Тип-член is_always_equal объявлен устаревшим через LWG issue 3170 , поскольку он приводит к тому, что пользовательские аллокаторы, унаследованные от std::allocator , по умолчанию считаются всегда равными. std:: allocator_traits < std :: allocator < T >> :: is_always_equal не объявлен устаревшим, и его константа-член value равна true для любого T .

Пример

#include <iostream>
#include <memory>
#include <string>
int main()
{
    // аллокатор по умолчанию для int
    std::allocator<int> alloc1;
    // демонстрация нескольких непосредственно используемых членов
    static_assert(std::is_same_v<int, decltype(alloc1)::value_type>);
    int* p1 = alloc1.allocate(1); // место для одного int
    alloc1.deallocate(p1, 1);     // и оно освобождено
    // Однако их также можно использовать через traits, поэтому нет необходимости
    using traits_t1 = std::allocator_traits<decltype(alloc1)>; // Соответствующий trait
    p1 = traits_t1::allocate(alloc1, 1);
    traits_t1::construct(alloc1, p1, 7);  // создаем int
    std::cout << *p1 << '\n';
    traits_t1::deallocate(alloc1, p1, 1); // освобождаем место для одного int
    // аллокатор по умолчанию для строк
    std::allocator<std::string> alloc2;
    // соответствующие traits
    using traits_t2 = std::allocator_traits<decltype(alloc2)>;
    // Перепривязка аллокатора с использованием trait для строк дает тот же тип
    traits_t2::rebind_alloc<std::string> alloc_ = alloc2;
    std::string* p2 = traits_t2::allocate(alloc2, 2); // место для 2 строк
    traits_t2::construct(alloc2, p2, "foo");
    traits_t2::construct(alloc2, p2 + 1, "bar");
    std::cout << p2[0] << ' ' << p2[1] << '\n';
    traits_t2::destroy(alloc2, p2 + 1);
    traits_t2::destroy(alloc2, p2);
    traits_t2::deallocate(alloc2, p2, 2);
}

Вывод:

7
foo bar

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2103 C++11 избыточное сравнение между allocator могло требоваться propagate_on_container_move_assignment предоставлен
LWG 2108 C++11 не было способа показать, что allocator не имеет состояния is_always_equal предоставлен

Смотрите также

предоставляет информацию о типах аллокаторов
(шаблон класса)
реализует многоуровневый аллокатор для многоуровневых контейнеров
(шаблон класса)
проверяет, поддерживает ли указанный тип конструкцию с использованием аллокатора
(шаблон класса)