std::allocator<T>::allocate
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>
)
|