Пространства имён
Варианты
Действия

std::allocator::allocate

Материал из cppreference.com
 
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
std::allocator
Функции-элементы
(до C++20)
(до C++20)
Функции, не являющиеся элементами
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
(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, элементы которого ещё не созданы.

Исключения

Генерирует 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++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 578 C++98 hint должен был быть либо 0, либо указателем, ранее
возвращённым из allocate() и ещё не переданным
в deallocate()
не требуется
LWG 3190 C++11 allocate() может выделить хранилище неправильного
размера
вместо этого генерирует std::bad_array_new_length

Смотрите также

[static]
выделяет неинициализированное хранилище с помощью аллокатора
(public static функция-элемент std::allocator_traits) [править]