Spec-Zone.ru › C++

std::allocator<T>::allocate

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++.

Отчет об ошибке Применяется к Поведение согласно опубликованной версии Исправленное поведение
LWG 578 C++98 hint должен был быть либо 0, либо
указателем, ранее возвращенным allocate(),
который еще не был передан в deallocate()
не требуется
LWG 3190 C++11 allocate() могла выделить память неверного размера вместо этого выбрасывает std::bad_array_new_length

См. также

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

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

Spec-Zone.ru

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