Types de pointeurs intelligents C++ et scénarios d'utilisation

1. Dilemme de la gestion des pointeurs

  1. La ressource est libérée et le pointeur n'est pas défini sur null.
    Pointeur sauvage : un seul pointeur pointe vers la ressource.
    Pointeur suspendu : plusieurs pointeurs pointent vers la même ressource.
    La mémoire est piétinée.

  2. Les ressources ne sont pas libérées, ce qui entraîne des fuites de mémoire

  3. Libérer les ressources à plusieurs reprises, provoquant un coredump

2. Comment le résoudre ?

  1. Les pointeurs intelligents utilisent les idées RAIl pour gérer automatiquement la libération des ressources dynamiques pointées par les pointeurs.

  2. RAIl utilise principalement le cycle de vie des objets pour contrôler les ressources du programme.

  3. Les pointeurs intelligents utilisent des constructeurs et des destructeurs de classe pour gérer les ressources

3. Types de pointeurs intelligents

1.shared_ptr

Sémantique : propriété partagée

La ressource n'a pas de propriétaire clair

Principe : Comptage de références

Scénario : les pointeurs sont gérés dans le conteneur ; les ressources sont transmises via des fonctions

Conditions d'utilisation:

  • Lorsque vous utilisez shared ptr pour gérer des ressources dynamiques, n'utilisez pas le pointeur brut d'origine.
    Lors de la construction de pointeurs intelligents, n'exposez pas de pointeurs bruts.
    Essayez d'utiliser make_shared pour construire des pointeurs intelligents.
    N'utilisez pas de pointeurs bruts via get.
    N'utilisez pas un seul pointeur pour construire plusieurs objets pointeurs intelligents.
  • Pour utiliser le pointeur d'objet de classe (this) comme retour shared_ptr
  • Impossible d'exposer les pointeurs bruts

2.faible_ptr

Auxiliaire shared_ptr, utilisé pour résoudre les références circulaires shared_ptr, car les références faibles n'occupent pas un nombre de références élevé

3.unique_ptr

Sémantique : propriété exclusive,
pas de construction de copie,
pas d'opérateur d'affectation,
seules la construction de déplacement et l'affectation de déplacement sont fournies

Préciser qu'un objet n'a qu'un seul propriétaire

Conditions d'utilisation:

  • La copie n'est pas prise en charge, mais un unique_ptr peut être renvoyé par la fonction.
    Optimisation du compilateur.
    Si l'optimisation du compilateur est désactivée : s'il existe un constructeur de déplacement, appelez le constructeur de déplacement ; s'il existe un constructeur de copie, appelez le constructeur de copie ; si il n'y a pas de constructeur de copie, une erreur sera signalée.

  • rendre unique mais uniquement fourni par c++14


Je recommande un cours de projet de la Lingsheng Academy. Personnellement, je pense que le professeur l'a bien enseigné. J'aimerais le partager avec vous :
Lingsheng Platinum Learning Card (y compris infrastructure/stockage haute performance/golang cloud natif/audio et vidéo/noyau Linux)
https://xxetb.xet.tech/s/VsFMs

Je suppose que tu aimes

Origine blog.csdn.net/qq_40135848/article/details/132942718
conseillé
Classement