Utiliser des pointeurs intelligents en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::shared_ptr pour que plusieurs pointeurs se réfèrent au même objet en C++
  2. Utilisez std::unique_ptr pour qu’un pointeur possède l’objet donné en C++
Utiliser des pointeurs intelligents en C++

Cet article présente plusieurs méthodes d’utilisation des pointeurs intelligents en C++.

Utilisez std::shared_ptr pour que plusieurs pointeurs se réfèrent au même objet en C++

Étant donné que la gestion manuelle de la mémoire dynamique s’avère assez difficile pour les projets du monde réel et est souvent la cause principale des bogues, C++ fournit le concept de pointeurs intelligents en tant que bibliothèque séparée. Les pointeurs intelligents agissent généralement comme des pointeurs réguliers et fournissent des fonctionnalités supplémentaires, dont la plus importante est de libérer automatiquement les objets pointus. Il existe deux principaux types de pointeurs intelligents: shared_ptr et unique_ptr.

L’exemple de code suivant illustre l’utilisation du type shared_ptr. Notez que shared_ptr est généralement utilisé lorsque l’objet pointé doit être référencé par d’autres pointeurs partagés. Ainsi, shared_ptr a en interne le compteur associé, qui indique le nombre de pointeurs qui pointent vers le même objet. La fonction membre shared_ptr::unique peut être utilisée pour déterminer si le pointeur n’est qu’un seul référençant l’objet courant. Le type de retour de la fonction est booléen et la valeur true confirme la propriété exclusive de l’objet. La fonction intégrée reset remplace l’objet courant par l’objet passé comme premier paramètre. L’objet partagé est supprimé lorsque le dernier shared_ptr pointant vers l’objet est hors de portée.

#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::shared_ptr<string> p(new string("Arbitrary string"));
  std::shared_ptr<string> p2(p);

  cout << "p : " << p << endl;
  cout << "p2: " << p2 << endl;

  if (!p.unique()) {
    p.reset(new string(*p));
  }
  cout << "p : " << p << endl;

  *p += " modified";
  cout << "*p : " << *p << endl;
  cout << "*p2 : " << *p2 << endl;

  return EXIT_SUCCESS;
}

Production:

p : 0x2272c20
p2: 0x2272c20
p : 0x2273ca0
*p : Arbitrary string modified
*p2 : Arbitrary string

Utilisez std::unique_ptr pour qu’un pointeur possède l’objet donné en C++

Alternativement, C++ fournit le type unique_ptr qui est le seul propriétaire de l’objet. Aucun autre pointeur unique_ptr ne peut le référencer. unique_ptr ne prend pas en charge les opérations ordinaires de copie et d’affectation. Pourtant, la propriété de l’objet peut être transférée entre deux pointeurs unique_ptr en utilisant les fonctions intégrées: release et reset. L’appel de la fonction release rend nul le pointeur unique_ptr. Une fois le unique_ptr libéré, alors la fonction reset peut être appelée pour lui attribuer une nouvelle propriété d’objet.

#include <iostream>
#include <memory>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::unique_ptr<string> p1(new string("Arbitrary string 2"));

  std::unique_ptr<string> p3(p1.release());

  cout << "*p3 : " << *p3 << endl;
  cout << "p3 : " << p3 << endl;
  cout << "p1 : " << p1 << endl;

  std::unique_ptr<string> p4(new string("Arbitrary string 3"));

  p3.reset(p4.release());
  cout << "*p3 : " << *p3 << endl;
  cout << "p3 : " << p3 << endl;
  cout << "p4 : " << p4 << endl;

  return EXIT_SUCCESS;
}

Production:

*p3 : Arbitrary string 2
p3 : 0x7d4c20
p1 : 0
*p3 : Arbitrary string 3
p3 : 0x7d5c80
p4 : 0
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Pointer