std::shared_ptr
Déclaré dans l'en-tête <memory> | ||
template<class T >class shared_ptr; | (depuis C++11) | |
std::shared_ptr
est un pointeur intelligent qui permet le partage d'un objet via un pointeur. Plusieurs instances de shared_ptr
peuvent posséder le même objet, et cet objet est détruit dans l'un des cas suivant :
- le dernier
shared_ptr
possédant l'objet est détruit ;
- le dernier
shared_ptr
possédant l'objet est assigné à un autre pointeur viaoperator=()
oureset()
.
L'objet est détruit en utilisant delete-expression ou un destructeur personnalisé fourni à la construction du shared_ptr
.
Un shared_ptr
peut partager la possession d'un objet tout en gardant un pointeur sur un autre objet. Cela peut être utilisé pour pointer sur un objet membre, tout en possédant l'objet auquel il appartient.
Un shared_ptr
peut aussi ne pas posséder d'objet, il est alors qualifié de vide.
shared_ptr
répond aux conditions de CopyConstructible
et CopyAssignable
.
Sommaire |
[modifier]Types de membres
Type du membre | Définition |
element_type | T |
[modifier]Fonctions membres
Construit un nouveau shared_ptr (fonction membre publique) | |
Détruit l'objet possédé si plus aucun shared_ptr s n'y est lié (fonction membre publique) | |
assigne le shared_ptr (fonction membre publique) | |
Manipulateurs | |
remplace l'objet géré Original: replaces the managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
permute les objets gérés Original: swaps the managed objects The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
Accès aux éléments | |
renvoie un pointeur sur l'objet géré Original: returns a pointer to the managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
déréférence le pointeur à l'objet géré Original: dereferences pointer to the managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
retourne le nombre d'objets shared_ptr se référant au même objet géré Original: returns the number of shared_ptr objects referring to the same managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
vérifie si l'objet géré est géré uniquement par l'instance actuelle shared_ptr Original: checks whether the managed object is managed only by the current shared_ptr instance The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
vérifie si il est associé objet géré Original: checks if there is associated managed object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) | |
fournit propriétaire-fondé l'ordre des pointeurs partagés Original: provides owner-based ordering of shared pointers The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction membre publique) |
[modifier]Fonctions annexes
crée un pointeur partagé qui gère un nouvel objet Original: creates a shared pointer that manages a new object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
crée un pointeur partagé qui gère un nouvel objet alloué à l'aide d'un allocateur Original: creates a shared pointer that manages a new object allocated using an allocator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
static_cast s'applique, dynamic_cast ou const_cast le type de l'objet géré Original: The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
retourne le deleter du type spécifié, s'il était possédé Original: returns the deleter of specified type, if owned The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
compare avec un autre ou avec shared_ptr nullptrOriginal: compares with another shared_ptr or with nullptrThe text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
délivre en sortie la valeur du pointeur est parvenu à un flux de sortie Original: outputs the value of the managed pointer to an output stream The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) | |
(C++11) | l'algorithme spécialisé std::swap Original: specializes the std::swap algorithm The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (fonction générique) |
spécialise les opérations atomiques (fonction générique) |
[modifier]Classes d'aide
(C++11) | Support du hachage pour std::shared_ptr (classe générique spécialisée) |
[modifier]Notes
La possession d'un objet peut être partagée avec un autre shared_ptr
seulement en le copiant ou en l'utilisant pour le constructeur par copie d'un autre shared_ptr
. Construire un nouveau shared_ptr
en utilisant le pointeur nu sous-jacent (en utilisant par exemple get()
) conduit à un comportement indéfini.
[modifier]Notes d'implémentation
Dans une implémentation typique, std::shared_ptr conserve deux pointeurs :
- Un pointeur vers l'objet géré
- Un pointeur vers le bloc de contrôle
Le bloc de contrôle est un objet alloué dynamiquement qui conserve :
- soit un pointeur vers l'objet géré, soit l'objet géré lui-même
- le destructeur (type-erased)
- l'allocateur (type-erased)
- le nombre de
shared_ptr
s qui possèdent l'objet géré - le nombre de
weak_ptr
s qui pointent sur l'objet géré
Quand un shared_ptr
est créé en appelant std::make_shared ou std::allocate_shared, la mémoire du bloc de contrôle et celle de l'objet géré sont créées en une seule allocation. L'objet géré est construit directement dans un membre du bloc de contrôle. Quand shared_ptr
est créé par l'un des constructeurs de shared_ptr
, l'objet géré et le bloc de contrôle doivent être alloués séparément. Dans ce cas, le bloc de contrôle conserve un pointeur vers l'objet géré.
Le pointeur conservé directement par le shared_ptr
est celui retourné par get()
, tandis que le pointeur / l'objet conservé par le bloc de contrôle est celui qui sera détruit lorsque le nombre de possesseurs partagés atteint zéro. Ces pointeurs ne sont pas forcément équivalents.
Le destructeur de shared_ptr
décrémente le nombre de possesseurs du bloc de contrôle. Si ce compteur atteint zéro, le bloc de contrôle appelle le destructeur de l'objet géré. Le bloc de contrôle ne se désalloue pas lui-même tant que le compteur du std::weak_ptr n'a pas aussi atteint zéro.