◐ Shell
clean mode source ↗

std::allocator::allocate — cppreference.com

Материал из cppreference.com

<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

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

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