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 argsUsarlo 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 intPassaggio 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 deleteget(): 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 itunique_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
- Perché gli smart pointer sostituiscono new e delete grezzi
- unique_ptr e ownership esclusiva
- shared_ptr e weak_ptr: ownership condivisa
- Deleter personalizzati e funzioni make