std:: allocator
|
Определено в заголовочном файле
<memory>
|
||
|
template
<
class
T
>
struct allocator ; |
(1) | |
|
template
<>
struct allocator < void > ; |
(2) |
(устарело в C++17)
(удалено в C++20) |
Класс-шаблон
std::allocator
является стандартным
Allокатором
, используемым всеми контейнерами стандартной библиотеки, если пользовательский аллокатор не указан. Стандартный аллокатор не имеет состояния, то есть все экземпляры данного аллокатора взаимозаменяемы, сравнимы между собой и могут освобождать память, выделенную любым другим экземпляром того же типа аллокатора.
|
Явная специализация для
void
не содержит typedef-члены
|
(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
|
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) |
|
|
(C++23)
|
выделяет неинициализированную память размером не менее запрошенного
(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
предоставлен
|
Смотрите также
|
(C++11)
|
предоставляет информацию о типах аллокаторов
(шаблон класса) |
|
(C++11)
|
реализует многоуровневый аллокатор для многоуровневых контейнеров
(шаблон класса) |
|
(C++11)
|
проверяет, поддерживает ли указанный тип конструкцию с использованием аллокатора
(шаблон класса) |