Namespaces
Variants

std::allocator<T>:: allocate

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(1)
pointer allocate ( size_type n, const void * hint = 0 ) ;
(hasta C++17)
T * allocate ( std:: size_t n, const void * hint ) ;
(desde C++17)
(obsoleto)
(eliminado en C++20)
(2)
T * allocate ( std:: size_t n ) ;
(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 está especificado cuándo o cómo se llama esta función. El puntero hint puede utilizarse para proporcionar localidad de referencia: el asignador, si es compatible con la implementación, intentará asignar el nuevo bloque de memoria tan cerca como sea posible de hint .

Luego, esta función crea un array 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 utilizar esta función en una expresión constante, el almacenamiento asignado debe ser desasignado durante la evaluación de la misma expresión.

(since C++20)

Contenidos

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> )