Usa i puntatori intelligenti in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::shared_ptr per più puntatori per fare riferimento allo stesso oggetto in C++
  2. Usa std::unique_ptr per un puntatore a possedere l’oggetto dato in C++
Usa i puntatori intelligenti 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
Autore: 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

Articolo correlato - C++ Pointer