Utilisation de base de shared_ptr
shared_ptr utilise le comptage de références pour gérer l'objet pointé. Lorsqu'il y a un nouveau shared_ptr pointant vers le même objet (copie du shared_ptr, etc.), le décompte de références est incrémenté de 1. Lorsque shared_ptr sort de la portée, le nombre de références est décrémenté de 1. Lorsque le compteur de références atteint 0, la mémoire gérée est libérée.
L'avantage est que cela soulage les programmeurs de la pression de libérer manuellement de la mémoire. Dans le passé, afin de gérer les exceptions dans le programme, il était souvent nécessaire d'encapsuler manuellement le pointeur dans une classe et de libérer la mémoire allouée dynamiquement via le destructeur ; désormais, ce processus peut être laissé à shared_ptr.
Généralement, nous utilisons make_shared pour obtenir shared_ptr.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
shared_ptr et new
shared_ptr peuvent être initialisés à l'aide d'un pointeur renvoyé par une nouvelle expression.
1 2 3 4 |
|
Cependant, le pointeur renvoyé par une nouvelle expression ne peut pas être affecté à shared_ptr.
De plus, une attention particulière doit être portée à ne pas mélanger new et shared_ptr !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Le fragment de programme ci-dessus affichera :
in process use_count:2
v5 : 1024
in process use_count:1
v6 : 0
Vous pouvez voir que lorsque le processus p6 est utilisé pour la deuxième fois, le décompte de référence de shared_ptr est 1, En quittant la portée du processus, la mémoire correspondante sera libérée et p6 deviendra un pointeur suspendu.
Donc, une fois le pointeur renvoyé par une nouvelle expression géré par shared_ptr, n'accédez pas à cette mémoire via des pointeurs ordinaires !
shared_ptr.reset
shared_ptr peut être réinitialisé pour pointer vers un autre objet via la méthode de réinitialisation, auquel moment le nombre de références de l'objet d'origine est réduit de un.
1 2 3 4 5 |
|
Vous pouvez personnaliser une fonction de suppression à appeler lorsque shared_ptr libère l'objet.
1 2 3 4 5 6 7 8 9 10 |
|
unique_ptr Utilisation de base
unique_ptr est exclusif à l'objet pointé, comme son nom l'indique. Par conséquent, unique_ptr ne peut pas être copié, attribué, etc., mais le contrôle peut être transféré entre unique_ptr via la fonction release.
1 2 3 4 5 6 7 8 9 10 |
|
unique_ptr comme paramètre et valeur de retour
Il existe deux cas particuliers pour les restrictions de copie ci-dessus, c'est-à-dire que unique_ptr peut être utilisé comme fonction La valeur de retour et les paramètres sont utilisés Bien qu'il existe une copie implicite pour le moment, ce n'est pas irréalisable.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
La fonction std::move ici sera discutée en détail plus tard ^_^
unique_ptr deleter
unique_ptr peut également définir un deleter. Contrairement à shared_ptr, il doit spécifier le type de deleter dans le paramètre du modèle. Heureusement, nous disposons du puissant outil decltype, sinon ce serait difficile à écrire.
1 2 3 4 5 |
|
weak_ptr
weak_ptr est généralement utilisé en conjonction avec shared_ptr. Il peut pointer vers l'objet pointé par shared_ptr, mais cela n'augmente pas le nombre de références de l'objet. De cette façon, il est possible que l'objet pointé par low_ptr ait effectivement été libéré. Par conséquent, faible_ptr a une fonction de verrouillage qui tente de récupérer un shared_ptr pointant vers l'objet.
1 2 3 4 5 6 7 |
|
Résumé
shared_ptr utilise le comptage de références pour gérer l'objet pointé.
Shared_ptr peut être initialisé à l'aide d'un pointeur renvoyé par une nouvelle expression ; cependant, un pointeur renvoyé par une nouvelle expression ne peut pas être attribué à shared_ptr.
Une fois le pointeur renvoyé par une nouvelle expression géré par shared_ptr, n'accédez pas à cette mémoire via des pointeurs ordinaires.
shared_ptr peut être réinitialisé pour pointer vers un autre objet via la méthode de réinitialisation. À ce stade, le nombre de références de l'objet d'origine est décrémenté de un.
Vous pouvez personnaliser une fonction de suppression à appeler lorsque shared_ptr libère l'objet.
unique_ptr est exclusif à l'objet pointé.
Unique_ptr ne peut pas être copié, attribué, etc., mais le contrôle peut être transféré entre unique_ptr via la fonction release.
unique_ptr peut être utilisé comme valeur de retour et paramètre de la fonction.
unique_ptr peut également définir un suppresseur, et le type de suppresseur doit être spécifié dans les paramètres du modèle.
Weak_ptr est généralement utilisé en conjonction avec shared_ptr. Il peut pointer vers l'objet pointé par shared_ptr, mais cela n'augmente pas le nombre de références de l'objet.
Weak_ptr a une fonction de verrouillage qui tente de récupérer un shared_ptr pointant vers l'objet.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.
Pour plus d'articles liés aux nouvelles fonctionnalités de C 11, aux pointeurs intelligents (shared_ptr/unique_ptr/weak_ptr), veuillez faire attention au site Web PHP chinois !