Spec-Zone.ru › C++

std::allocator<T>::allocate

(1)
pointer allocate( size_type n, const void* hint = 0 );
(до C++17)
T* allocate( std::size_t n, const void* hint );
(с C++17)
(устарело)
(удалено в C++20)
(2)
T* allocate( std::size_t n );
(с C++17)
(до C++20)
[[nodiscard]] 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 Применено к Поведение, как опубликовано Корректное поведение
LWG 578 C++98 hint должно было быть либо ​0​ или указателем, возвращённым ранее из allocate()
и ещё не переданным в deallocate()
не требуется
LWG 3190 C++11 allocate() может выделить хранилище неправильного размера бросает std::bad_array_new_length вместо этого

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/allocator/allocate

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API