std::allocator<T>::allocate
| (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) | |
[[nodiscard]] 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++.
| DR | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 578 | C++98 |
hint должно было быть либо 0 или указателем, возвращённым ранее из allocate()и ещё не переданным в deallocate() | не требуется |
| LWG 3190 | C++11 |
allocate() может выделить хранилище неправильного размера | бросает std::bad_array_new_length вместо этого |
См. также
|
[static] | выделяет неинициализированное хранилище с помощью аллокатора (общедоступный статический член-функция std::allocator_traits<Alloc>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/allocator/allocate