std:: allocator
|
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
|
(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
|
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) |
|
|
(C++23)
|
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
|
(C++11)
|
fournit des informations sur les types d'allocateur
(modèle de classe) |
|
(C++11)
|
implémente un allocateur multi-niveaux pour les conteneurs multi-niveaux
(modèle de classe) |
|
(C++11)
|
vérifie si le type spécifié prend en charge la construction uses-allocator
(modèle de classe) |