Utiliser des pointeurs intelligents en C++
-
Utilisez
std::shared_ptr
pour que plusieurs pointeurs se réfèrent au même objet en C++ -
Utilisez
std::unique_ptr
pour qu’un pointeur possède l’objet donné 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
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