Distruttori e pulizia
Rilasciare automaticamente le risorse
Distruttori e pulizia è 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.
Che cosa fa un distruttore
Un distruttore viene eseguito quando termina la durata di un oggetto. Il suo compito è rilasciare ciò che l'oggetto possiede. Il suo nome è ~ClassName.
#include <iostream>
class File {
public:
~File() { std::cout << "closing file\n"; }
};
int main() {
File f;
} // ~File runs hereLiberare la memoria posseduta
Se una classe possiede memoria nell'heap, il suo distruttore deve liberarla. Questo è il caso classico in cui chiamare delete.
#include <iostream>
class Buffer {
int* data;
public:
Buffer(int n) : data(new int[n]) {}
~Buffer() { delete[] data; } // cleanup
};
int main() { Buffer b(10); }I distruttori vengono eseguiti automaticamente
Non chiami personalmente i distruttori degli oggetti nello stack: il compilatore inserisce la chiamata al termine dell'ambito.
Ordine inverso dei membri
Gli oggetti membro vengono distrutti nell'ordine inverso rispetto alla dichiarazione, dopo l'esecuzione del corpo del distruttore.
#include <iostream>
struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
A a;
B b; // destroyed before a
~C() { std::cout << "~C\n"; }
};
int main() { C c; }Distruttori virtuali
Se elimina un oggetto derivato tramite un puntatore alla classe base, il distruttore della classe base deve essere virtual; altrimenti la parte derivata produce una perdita di memoria.
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
~Derived() override { std::cout << "~Derived\n"; }
};
int main() {
Base* p = new Derived();
delete p; // both run thanks to virtual
}I distruttori non dovrebbero generare eccezioni
Generare un'eccezione da un distruttore durante lo srotolamento dello stack termina il programma. I distruttori dovrebbero essere contrassegnati, implicitamente, come noexcept e non dovrebbero mai lasciar propagare le eccezioni.
Il distruttore predefinito
Se non ne scrive uno, il compilatore genera un distruttore che distrugge ogni membro. Per le classi composte solo da membri RAII, è esattamente la scelta corretta.
#include <string>
#include <vector>
struct Record {
std::string name; // self-cleaning
std::vector<int> values; // self-cleaning
}; // default destructor is enoughDistruttore = default
Scriva ~Class() = default; per richiedere esplicitamente il distruttore generato dal compilatore: è utile quando serve un distruttore virtuale ma non una logica personalizzata.
#include <iostream>
struct Shape {
virtual ~Shape() = default; // virtual + default
};Rilasciare risorse non di memoria
I distruttori chiudono anche i file, rilasciano i lock e disconnettono i socket: non si limitano a liberare la memoria. Qualsiasi risorsa acquisita deve essere gestita qui.
Ordine tra gli oggetti
Le variabili locali multiple vengono distrutte nell'ordine inverso rispetto alla costruzione, quindi un distruttore può usare in sicurezza gli oggetti creati prima di esso.
Lasciare che siano i membri RAII a occuparsene
Se ogni membro è un tipo RAII, spesso non serve affatto un distruttore personalizzato. Riservi i distruttori scritti a mano alle risorse grezze.
Verifica rapida
Verifichi la sua comprensione dei distruttori.
Riepilogo
Ha imparato che i distruttori rilasciano automaticamente le risorse possedute al termine della durata, distruggono i membri nell'ordine inverso rispetto alla dichiarazione, non devono generare eccezioni e devono essere virtual nelle classi base polimorfiche. I membri RAII rendono spesso superflui i distruttori personalizzati.
Domande Frequenti
La lezione «Distruttori e pulizia» è gratuita?
Sì — il testo completo di «Distruttori e pulizia» è 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 «Distruttori e pulizia»?
Rilasciare automaticamente le risorse 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 «Distruttori e pulizia»?
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
- Il principio RAII
- Distruttori e pulizia
- Regola del tre/cinque
- Guardie di ambito