Usa i puntatori intelligenti in C++
-
Usa
std::shared_ptr
per più puntatori per fare riferimento allo stesso oggetto in C++ -
Usa
std::unique_ptr
per un puntatore a possedere l’oggetto dato in C++
Questo articolo illustrerà più metodi su come utilizzare i puntatori intelligenti in C++.
Usa std::shared_ptr
per più puntatori per fare riferimento allo stesso oggetto in C++
Poiché la gestione manuale della memoria dinamica risulta essere piuttosto difficile per i progetti del mondo reale e spesso è la causa principale dei bug, il C++ fornisce il concetto di puntatori intelligenti come libreria separata. I puntatori intelligenti generalmente agiscono come puntatori regolari e forniscono funzionalità extra, la più importante delle quali è la liberazione automatica degli oggetti appuntiti. Esistono due tipi principali di puntatori intelligenti: shared_ptr
e unique_ptr
.
Il seguente codice di esempio dimostra l’utilizzo del tipo shared_ptr
. Notare che shared_ptr
è solitamente usato quando l’oggetto puntato deve essere referenziato da altri puntatori condivisi. Pertanto, shared_ptr
ha internamente il contatore associato, che denota il numero di puntatori che puntano allo stesso oggetto. La funzione membro shared_ptr::unique
può essere utilizzata per determinare se il puntatore è solo uno che fa riferimento all’oggetto corrente. Il tipo restituito dalla funzione è booleano e il valore true
conferma la proprietà esclusiva dell’oggetto. La funzione incorporata reset
sostituisce l’oggetto corrente con l’oggetto passato come primo parametro. L’oggetto condiviso viene cancellato quando l’ultimo shared_ptr
che punta all’oggetto esce dall’ambito.
#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;
}
Produzione:
p : 0x2272c20
p2: 0x2272c20
p : 0x2273ca0
*p : Arbitrary string modified
*p2 : Arbitrary string
Usa std::unique_ptr
per un puntatore a possedere l’oggetto dato in C++
In alternativa, C++ fornisce il tipo unique_ptr
che è l’unico proprietario dell’oggetto. Nessun altro puntatore unique_ptr
può farvi riferimento. unique_ptr
non supporta le normali operazioni di copia e assegnazione. Tuttavia, la proprietà dell’oggetto può essere trasferita tra due puntatori unique_ptr
utilizzando le funzioni integrate: release
e reset
. La chiamata alla funzione release
rende nullo il puntatore unique_ptr
. Una volta che unique_ptr
è stato rilasciato, la funzione reset
può essere chiamata per assegnargli una nuova proprietà dell’oggetto.
#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;
}
Produzione:
*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