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