Namespaces
Variants

std::allocator<T>:: allocate

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)
(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)
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 является неполным типом .

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

(since 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> )