Espacios de nombres
Variantes
Acciones

std::allocator

De cppreference.com
< cpp‎ | memory
 
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
allocator
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
Definido en el archivo de encabezado <memory>
template< class T >
struct allocator;
(1)
template<>
struct allocator<void>;
(2) (en desuso en C++17)
(eliminado en C++20)

La plantilla de clase std::allocator es el Allocator utilizado por todos los contenedores de la biblioteca estándar si no se proporciona un asignador especificado por el usuario. El asignador por defecto no tiene estado, es decir, todas las instancias del asignador dado son intercambiables, se comparan iguales y pueden desasignar la memoria asignada por cualquier otra instancia del mismo tipo de asignador.

La especialización explícita para void carece de los typedefs reference, const_reference, size_type y difference_type miembro. Esta especialización no declara funciones miembro.

(hasta C++20)

El asignador por defecto satisface los requerimientos de completitud de asignador.

(desde C++17)

Contenido

[editar] Tipos miembro

Tipo Definición
value_type T
pointer (en desuso en C++17)(eliminado en C++20) T*
const_pointer (en desuso en C++17)(eliminado en C++20) const T*
reference (en desuso en C++17)(eliminado en C++20) T&
const_reference (en desuso en C++17)(eliminado en C++20) const T&
size_type std::size_t
difference_type std::ptrdiff_t
propagate_on_container_move_assignment(C++14) std::true_type
rebind (en desuso en C++17)(eliminado en C++20) template< class U > struct rebind {

    typedef allocator<U> other;
};

is_always_equal(C++17)(en desuso en C++23) std::true_type

[editar] Funciones miembro

Crea una nueva instancia de asignador.
(función miembro pública) [editar]
Destruye una instancia de asignador.
(función miembro pública) [editar]
(hasta C++20)
Obtiene la dirección de un objeto, incluso si operator& está sobrecargado.
(función miembro pública) [editar]
Asigna almacenamiento no inicializado.
(función miembro pública) [editar]
Asigna almacenamiento al menos tan grande como el tamaño solicitado.
(función miembro pública) [editar]
Desasigna almacenamiento.
(función miembro pública) [editar]
(hasta C++20)
Devuelve el mayor tamaño de asignación admitido.
(función miembro pública) [editar]
(hasta C++20)
Construye un objeto en almacenamiento asignado.
(función miembro pública) [editar]
(hasta C++20)
Destruye un objeto en almacemiento asignado.
(función miembro pública) [editar]

[editar] Funciones no miembro

Compara dos instancias de asignador.
(función miembro pública) [editar]

[editar] Notas

La plantilla de clase miembro rebind proporciona una forma de obtener un asignador para un tipo diferente. Por ejemplo, std::list<T, A> asigna nodos de algún tipo interno Node<T>, utilizando el asignador A::rebind<Node<T>>::other (hasta C++11)std::allocator_traits<A>::rebind_alloc<Node<T>>, que se implementa en términos de A::rebind<Node<T>>::other si A es un std::allocator (desde C++11).

El tipo miembro is_always_equal está en desuso por Asunto LWG 3170, porque hace que por defecto los asignadores personalizados derivados de std::allocator sean tratados como siempre iguales. std::allocator_traits<std::allocator<T>>::is_always_equal no está en desuso y su constante miembro value es true para cualquier T.

[editar] Ejemplo

#include <memory>
#include <iostream>
#include <string>
 
int main()
{
    {
        // asignador por defecto para enteros
        std::allocator<int> alloc;
 
        // demostrando los pocos miembros directamente utilizables
        static_assert(std::is_same_v<int, decltype(alloc)::value_type>);
        int* p = alloc.allocate(1);  // espacio para un entero
        alloc.deallocate(p, 1);      // y se fue
 
        // sin embargo, incluso esos pueden usarse a través de rasgos,
        // así que no es necesario
        using traits_t = std::allocator_traits<decltype(alloc)>; // el rasgo coincidente
        p = traits_t::allocate(alloc, 1);
        traits_t::construct(alloc, p, 7);       // construir el entero
        std::cout << *p << '\n';
        traits_t::deallocate(alloc, p, 1);      // desasignar el espacio para un entero
    }
 
    {
        // asignador por defecto para cadenas
        std::allocator<std::string> alloc;
        // matching traits
        using traits_t = std::allocator_traits<decltype(alloc)>;
 
        // revincular el asignador usando el rasgo para cadenas obtiene el mismo tipo
        traits_t::rebind_alloc<std::string> alloc_ = alloc;
 
        std::string* p = traits_t::allocate(alloc, 2); // espacio para dos cadenas
 
        traits_t::construct(alloc, p, "foo");
        traits_t::construct(alloc, p + 1, "bar");
 
        std::cout << p[0] << ' ' << p[1] << '\n';
 
        traits_t::destroy(alloc, p + 1);
        traits_t::destroy(alloc, p);
        traits_t::deallocate(alloc, p, 2);
    }
}

Salida:

7
foo bar

[editar] Véase también

Proporciona información sobre los tipos de asignadores.
(plantilla de clase) [editar]
Implementa un asignador multinivel para contenedores multinivel.
(plantilla de clase) [editar]
Comprueba si el tipo especificado admite construcción con uso de asignador.
(plantilla de clase) [editar]