C++ Academy · Lezione

Deleter personalizzati e funzioni make

Usi std::make_unique, std::make_shared e deleter personalizzati per risorse diverse dalla memoria

Lezione 4 di 413 passaggi

Deleter personalizzati e funzioni make è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Perché usare deleter personalizzati?

Non tutte le risorse vengono liberate con delete. Handle di file, socket, risorse specifiche del sistema operativo e array richiedono ciascuno una funzione di pulizia diversa.

Deleter predefinito per unique_ptr

Per impostazione predefinita, unique_ptr<T> usa delete. Per gli array, usi unique_ptr<T[]>, che chiama delete[].

Specificare un deleter personalizzato

Passi un oggetto chiamabile come secondo argomento template. Il deleter riceve il puntatore grezzo e lo libera nel modo appropriato.

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

Deleter per shared_ptr

shared_ptr conserva il proprio deleter nel blocco di controllo: il tipo viene cancellato, quindi il tipo di shared_ptr non cambia.

std::shared_ptr<FILE> file(
    std::fopen("data.txt", "r"),
    [](FILE* f) { if (f) std::fclose(f); }
);

Casi d'uso comuni dei deleter personalizzati

Esempi pratici:

  • Handle di librerie C (FILE*, sqlite3*, handle curl)
  • Risorse del sistema operativo (HANDLE su Windows, fd su Unix)
  • Pool di memoria personalizzati
  • Oggetti esterni con conteggio dei riferimenti

std::make_unique (C++14)

Il modo consigliato per creare un unique_ptr. Inoltra gli argomenti al costruttore ed evita l'uso di new grezzo.

auto p = std::make_unique<Widget>(arg1, arg2);

Perché usare make_unique?

Tre vantaggi:

  • Sicurezza rispetto alle eccezioni: nel codice dell'utente non serve usare new grezzo
  • Non è necessario scrivere il tipo due volte
  • Non è possibile passare accidentalmente lo stesso puntatore grezzo a due unique_ptr

std::make_shared

Per shared_ptr, make_shared alloca il blocco di controllo e l'oggetto in un'unica allocazione sull'heap, risultando più veloce rispetto a due allocazioni separate.

auto p = std::make_shared<Widget>(arg1, arg2);

Quando make_shared presenta degli svantaggi

L'allocazione unica fa sì che la memoria dell'oggetto venga liberata solo quando sono scomparsi anche tutti i weak_ptr. Se i weak_ptr rimangono in vita più a lungo degli shared_ptr, preferisca la costruzione in due passaggi.

Combinare deleter personalizzati con make

make_unique e make_shared non accettano direttamente un deleter personalizzato. In tal caso, costruisca manualmente lo smart pointer.

// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
    std::fopen("data.txt", "r"),
    [](FILE* f) { if (f) std::fclose(f); }
);

Problema: il tipo della lambda come parametro template

Ogni lambda ha un tipo univoco. Per unique_ptr, usi decltype(my_deleter) nella dichiarazione; in alternativa, usi una funzione con nome o un puntatore a funzione per mantenere semplici i tipi.

Verifica rapida

Quale funzione factory consente di allocare uno std::shared_ptr e il relativo blocco di controllo in un'unica allocazione sull'heap?

Riepilogo

Usi make_unique e make_shared nei casi ordinari. Fornisca un deleter personalizzato, cioè una lambda o una funzione, quando la risorsa richiede qualcosa di più di delete: handle di file, oggetti del sistema operativo o operazioni di pulizia di librerie C.

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Deleter personalizzati e funzioni make» è gratuita?

Sì — il testo completo di «Deleter personalizzati e funzioni make» è 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 «Deleter personalizzati e funzioni make»?

Usi std::make_unique, std::make_shared e deleter personalizzati per risorse diverse dalla memoria 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 4 di 4.

Quanto tempo richiede la lezione «Deleter personalizzati e funzioni make»?

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