0Pricing
C++ Academy · Lezione

unique_ptr e ownership esclusiva

Esprima la semantica del singolo proprietario con unique_ptr e tipi move-only

unique_ptr e ownership esclusiva è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Il puntatore intelligente con proprietario unico

std::unique_ptr<T> possiede un oggetto nell'heap. Quando unique_ptr viene distrutto, elimina l'oggetto. Non può essere copiato, ma solo spostato.

Creazione di unique_ptr

Usi std::make_unique (C++14): è sicuro rispetto alle eccezioni e conciso.

#include <memory>
auto w = std::make_unique<Widget>();         // default-constructed
auto p = std::make_unique<Point>(3, 4);       // forwarded args

Usarlo come un puntatore

unique_ptr supporta le consuete operazioni sui puntatori.

auto p = std::make_unique<Point>(3, 4);
std::cout << p->x;        // arrow access
std::cout << (*p).y;      // dereference
if (p) std::cout << "non-null";

Non copiabile — trasferibile

La copia implicherebbe due proprietari, violando il concetto di «unique». Lo spostamento trasferisce la proprietà.

std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the int

Passaggio alle funzioni

Per valore, con std::move: trasferisce la proprietà. Per riferimento: consente di prendere in prestito l'oggetto senza diventarne proprietario.

void consume(std::unique_ptr<Widget> w);   // takes ownership
void inspect(const Widget& w);              // borrows

auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w);                                // (after re-creating)

Restituzione dalle funzioni

Una funzione che alloca un oggetto e ne restituisce la proprietà dovrebbe restituire un std::unique_ptr.

std::unique_ptr<Widget> create() {
    return std::make_unique<Widget>();
}

Reimpostazione e rilascio

reset() elimina l'oggetto corrente e, facoltativamente, acquisisce la proprietà di uno nuovo. release() rinuncia alla proprietà e restituisce il puntatore grezzo.

auto p = std::make_unique<int>(10);
p.reset(new int(20));    // delete the old, own the new
int* raw = p.release();   // p is now empty
delete raw;               // caller must delete

get(): prendere in prestito il puntatore grezzo

get() restituisce il puntatore grezzo senza rinunciare alla proprietà. Lo usi per l'interoperabilità senza trasferimento di proprietà.

auto p = std::make_unique<int>(42);
legacy_api(p.get());      // p still owns it

unique_ptr per gli array

Per gli array usi unique_ptr<T[]>. L'accesso indicizzato avviene con []; alla distruzione viene chiamato delete[].

auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];

Deleter personalizzati

Fornisca un deleter personalizzato come parametro del template quando la risorsa non è memoria grezza, ad esempio per handle di file o risorse del sistema operativo.

auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);

Prestazioni

Con il deleter predefinito, unique_ptr ha le stesse dimensioni e la stessa velocità di un puntatore grezzo: overhead nullo.

Verifica rapida

Perché std::unique_ptr impedisce la copia?

Riepilogo

std::unique_ptr è il puntatore intelligente predefinito: overhead nullo, proprietà esclusiva, spostabile ma non copiabile. Preferisca std::make_unique per la costruzione.

Domande Frequenti

La lezione «unique_ptr e ownership esclusiva» è gratuita?

Sì — il testo completo di «unique_ptr e ownership esclusiva» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «unique_ptr e ownership esclusiva»?

Esprima la semantica del singolo proprietario con unique_ptr e tipi move-only Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «unique_ptr e ownership esclusiva»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché gli smart pointer sostituiscono new e delete grezzi
  2. unique_ptr e ownership esclusiva
  3. shared_ptr e weak_ptr: ownership condivisa
  4. Deleter personalizzati e funzioni make
← Torna a C++ Academy