Namespaces
Variants

std:: allocator

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)
Défini dans l'en-tête <memory>
template < class T >
struct allocator ;
(1)
template <>
struct allocator < void > ;
(2) (obsolète en C++17)
(supprimé en C++20)

La classe template std::allocator est l'allocateur par défaut Allocator utilisé par tous les conteneurs de la bibliothèque standard si aucun allocateur spécifié par l'utilisateur n'est fourni. L'allocateur par défaut est sans état, c'est-à-dire que toutes les instances d'un allocateur donné sont interchangeables, se comparent égales et peuvent désallouer la mémoire allouée par toute autre instance du même type d'allocateur.

La spécialisation explicite pour void ne possède pas les typedefs membres reference , const_reference , size_type et difference_type . Cette spécialisation ne déclare aucune fonction membre.

(jusqu'à C++20)

L'allocateur par défaut satisfait les exigences de complétude d'allocateur .

(depuis C++17)

Table des matières

Types membres

Type Définition
value_type T
pointer (obsolète en C++17) (supprimé en C++20) T*
const_pointer (obsolète en C++17) (supprimé en C++20) const T *
reference (obsolète en C++17) (supprimé en C++20) T&
const_reference (obsolète en C++17) (supprimé en C++20) const T &
size_type std::size_t
difference_type std::ptrdiff_t
propagate_on_container_move_assignment (C++11) std::true_type
rebind (obsolète en C++17) (supprimé en C++20) template < class U >

struct rebind
{
typedef allocator < U > other ;
} ;

is_always_equal (C++11) (obsolète en C++23) (supprimé en C++26) std::true_type

Fonctions membres

crée une nouvelle instance d'allocateur
(fonction membre publique)
détruit une instance d'allocateur
(fonction membre publique)
(until C++20)
obtient l'adresse d'un objet, même si operator & est surchargé
(fonction membre publique)
alloue un stockage non initialisé
(fonction membre publique)
alloue un stockage non initialisé d'au moins la taille demandée
(fonction membre publique)
libère le stockage
(fonction membre publique)
(until C++20)
retourne la plus grande taille d'allocation supportée
(fonction membre publique)
(until C++20)
construit un objet dans le stockage alloué
(fonction membre publique)
(until C++20)
détruit un objet dans le stockage alloué
(fonction membre publique)

Fonctions non membres

(supprimé en C++20)
compare deux instances d'allocateur
(fonction membre publique)

Notes

La classe template membre rebind fournit un moyen d'obtenir un allocateur pour un type différent. Par exemple, std:: list < T, A > alloue des nœuds d'un certain type interne Node<T> , en utilisant l'allocateur A::rebind<Node<T>>::other (jusqu'à C++11) std:: allocator_traits < A > :: rebind_alloc < Node < T >> , qui est implémenté en termes de A::rebind<Node<T>>::other si A est un std::allocator (depuis C++11) .

Le type membre is_always_equal est déprécié via LWG issue 3170 , car il fait que les allocateurs personnalisés dérivés de std::allocator sont traités comme toujours égaux par défaut. std:: allocator_traits < std :: allocator < T >> :: is_always_equal n'est pas déprécié et sa constante membre value vaut true pour tout T .

Exemple

#include <iostream>
#include <memory>
#include <string>
int main()
{
    // allocateur par défaut pour les entiers
    std::allocator<int> alloc1;
    // démonstration des quelques membres directement utilisables
    static_assert(std::is_same_v<int, decltype(alloc1)::value_type>);
    int* p1 = alloc1.allocate(1); // espace pour un entier
    alloc1.deallocate(p1, 1);     // et il est libéré
    // Même ceux-ci peuvent être utilisés via les traits, donc pas besoin
    using traits_t1 = std::allocator_traits<decltype(alloc1)>; // Le trait correspondant
    p1 = traits_t1::allocate(alloc1, 1);
    traits_t1::construct(alloc1, p1, 7);  // construit l'entier
    std::cout << *p1 << '\n';
    traits_t1::deallocate(alloc1, p1, 1); // désalloue l'espace pour un entier
    // allocateur par défaut pour les chaînes
    std::allocator<std::string> alloc2;
    // traits correspondants
    using traits_t2 = std::allocator_traits<decltype(alloc2)>;
    // Le rebind de l'allocateur utilisant le trait pour les chaînes donne le même type
    traits_t2::rebind_alloc<std::string> alloc_ = alloc2;
    std::string* p2 = traits_t2::allocate(alloc2, 2); // espace pour 2 chaînes
    traits_t2::construct(alloc2, p2, "foo");
    traits_t2::construct(alloc2, p2 + 1, "bar");
    std::cout << p2[0] << ' ' << p2[1] << '\n';
    traits_t2::destroy(alloc2, p2 + 1);
    traits_t2::destroy(alloc2, p2);
    traits_t2::deallocate(alloc2, p2, 2);
}

Sortie :

7
foo bar

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 2103 C++11 comparaison redondante entre allocator pouvait être requise propagate_on_container_move_assignment fourni
LWG 2108 C++11 aucune façon de démontrer que allocator est sans état is_always_equal fourni

Voir aussi

fournit des informations sur les types d'allocateur
(modèle de classe)
implémente un allocateur multi-niveaux pour les conteneurs multi-niveaux
(modèle de classe)
vérifie si le type spécifié prend en charge la construction uses-allocator
(modèle de classe)