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, элементы которого еще не были сконструированы.
Исключения
| Выбрасывает | (начиная с 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 |
См. также
|
[статическая] | выделяет неинициализированную память с помощью аллокатора (общедоступная статическая функция-член 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