Namespaces
Variants

std::allocator<T>::allocate

От ru.cppreference.net
 
 
Библиотека управления памятью
Аллокаторы
Ресурсы памяти
Неинициализированное хранилище (до C++20*)
Поддержка сборщика мусора (до C++23)
 
std::allocator
Функции-элементы
(до C++20)
(до C++20)
Функции, не являющиеся элементами
 
pointer allocate( size_type n, const void* hint = 0 );
(1) (до C++17)
T* allocate( std::size_t n, const void* hint );
(начиная с C++17)
(удалено в C++20)
T* allocate( std::size_t n );
(2) (начиная с C++17)
(до C++20)
constexpr T* allocate( std::size_t n );
(начиная с C++20)

Выделяет n * sizeof(T) байт неинициализированного хранилища путём вызова ::operator new(std::size_t) или ::operator new(std::size_t, std::align_val_t)(начиная с C++17), но не уточняется, когда и как вызывается эта функция. Указатель hint может использоваться для обеспечения локальности ссылок: аллокатор, если это поддерживается реализацией, попытается выделить новый блок памяти как можно ближе к hint.

Затем эта функция создаёт массив типа T[n] в хранилище и начинает его время жизни, но не начинает время жизни ни одного из его элементов.

Использование этой функции является некорректным, если T является неполным типом.

Для использования этой функции в константном выражении выделенное хранилище должно быть освобождено в пределах вычисления того же выражения.

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

Параметры

n - количество объектов, для которых выделяется память
hint - указатель на ближайшее место в памяти

Возвращаемое значение

Указатель на первый элемент массива из n объектов типа T , элементы которого ещё не сконструированы.

Исключения

Выбрасывает std::bad_array_new_length если std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n .

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

Выбрасывает std::bad_alloc при неудачном выделении памяти.

Примечания

Формулировка «неопределённо когда и как» позволяет объединять или исключать выделения памяти в куче , выполняемые контейнерами стандартной библиотеки, даже если такие оптимизации запрещены для прямых вызовов ::operator new . Например, это реализовано в libc++ ( [1] и [2] ).

После вызова allocate() и до конструирования элементов арифметика указателей T* корректно определена в пределах выделенного массива, но поведение не определено при обращении к элементам.

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

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

DR Applied to Behavior as published Correct behavior
LWG 578 C++98 hint требовалось быть либо ​ 0 ​ , либо указателем,
ранее возвращенным из allocate()
и еще не переданным в deallocate()
не требуется
LWG 3190 C++11 allocate() мог выделять память неправильного размера выбрасывает std::bad_array_new_length вместо этого

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

[static]
выделяет неинициализированную память с использованием аллокатора
(публичная статическая функция-член std::allocator_traits<Alloc> )