std::allocator<T>:: allocate
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
allocator::allocate
|
||||
|
(C++23)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
|
(until C++20)
|
||||
| Non-member functions | ||||
|
(until C++20)
|
| (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>
)
|