std::allocator<T>:: allocate
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
allocator::allocate
|
||||
|
(C++23)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
| Non-member functions | ||||
|
(until C++20)
|
| (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>
)
|