std::allocator::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, элементы которого ещё не созданы.
Исключения
|
Генерирует std::bad_array_new_length, если |
(начиная с 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)
|