Namespaces
Variants

std::allocator<T>::allocate

De es.cppreference.net
 
 
Biblioteca de gestión de memoria
Asignadores
Recursos de memoria
Almacenamiento no inicializado (hasta C++20*)
Soporte de recolector de basura (hasta C++23)
 
 
pointer allocate( size_type n, const void* hint = 0 );
(1) (hasta C++17)
T* allocate( std::size_t n, const void* hint );
(desde C++17)
(eliminado en C++20)
T* allocate( std::size_t n );
(2) (desde C++17)
(hasta C++20)
constexpr T* allocate( std::size_t n );
(desde C++20)

Asigna n * sizeof(T) bytes de almacenamiento no inicializado llamando a ::operator new(std::size_t) o ::operator new(std::size_t, std::align_val_t)(desde C++17), pero no se especifica cuándo ni cómo se llama a esta función. El puntero hint puede usarse para proporcionar localidad de referencia: el asignador, si la implementación lo admite, intentará asignar el nuevo bloque de memoria lo más cerca posible de hint.

Luego, esta función crea un arreglo de tipo T[n] en el almacenamiento e inicia su tiempo de vida, pero no inicia el tiempo de vida de ninguno de sus elementos.

El uso de esta función está mal formado si T es un tipo incompleto.

Para poder usar esta función en una expresión constante, el almacenamiento asignado debe desasignarse dentro de la evaluación de la misma expresión.

(desde C++20)

Parámetros

n - el número de objetos para los cuales asignar almacenamiento
hint - puntero a una ubicación de memoria cercana

Valor de retorno

Puntero al primer elemento de un arreglo de n objetos de tipo T cuyos elementos aún no han sido construidos.

Excepciones

Lanza std::bad_array_new_length si std:: numeric_limits < std:: size_t > :: max ( ) / sizeof ( T ) < n .

(desde C++11)

Lanza std::bad_alloc si la asignación de memoria falla.

Notas

La redacción "no especificado cuándo y cómo" permite combinar u optimizar las asignaciones de memoria dinámica realizadas por los contenedores de la biblioteca estándar, aunque dichas optimizaciones están prohibidas para las llamadas directas a ::operator new . Por ejemplo, esto está implementado por libc++ ( [1] y [2] ).

Después de llamar a allocate() y antes de la construcción de elementos, la aritmética de punteros de T* está bien definida dentro del array asignado, pero el comportamiento es indefinido si se accede a los elementos.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 578 C++98 hint debía ser o bien ​ 0 ​ o un
puntero devuelto previamente por allocate()
y que no se hubiera pasado aún a deallocate()
no requerido
LWG 3190 C++11 allocate() podría asignar almacenamiento de tamaño incorrecto lanza std::bad_array_new_length en su lugar

Véase también

[static]
asigna almacenamiento no inicializado usando el allocator
(función miembro pública estática de std::allocator_traits<Alloc> )