Che cosa fa un % espressione didelete
fare?
- Invoca il distruttore sui dati puntati.
- Libera la memoria che è stata allocata con
new
.
Poiché un delete
invocherà un distruttore, delete this
all'interno di un distruttore non ha senso (non so se questo sarebbe un ciclo infinito, o sarebbe un comportamento indefinito).
La parte ancora più problematica è che la maggior parte degli oggetti in C ++ non vengono creati con l'operatore new
, e quindi non dovrebbe essere distrutto esplicitamente tramite delete
. Invece, gli oggetti potrebbero essere variabili locali che vengono distrutte quando viene lasciato il loro ambito: questa distruzione deterministica abilita RAII. In alternativa, l'oggetto potrebbe essere un membro di un altro oggetto. I membri verranno distrutti dopo che il distruttore dell'oggetto che li ha chiusi è stato eseguito. Non devono essere distrutti in modo esplicito. Per esempio. supponi il seguente esempio:
#include <iostream>
class A
{
public:
~A() { std::cout << "~A()\n"; }
};
class B
{
A _a;
public:
~B() { std::cout << "~B()\n"; }
};
int main() {
B b;
return 0;
}
Quando viene lasciato l'ambito main
, l'oggetto B b
viene distrutto e viene eseguito il suo distruttore. Successivamente, ogni membro viene distrutto, quindi viene eseguito il distruttore di A _a
. Di conseguenza, l'output sarà
~B()
~A()
Se stai utilizzando new
e delete
per gestire la memoria, è importante specificare chi è responsabile per assicurarsi che un oggetto sia cancellato. In generale, chiunque lo abbia assegnato deve anche cancellarlo. Tuttavia, ci sono alcuni modelli in cui l'oggetto stesso è responsabile della sua stessa distruzione. Per esempio. un oggetto può essere conteggiato come riferimento e deve cancellarsi quando il conteggio dei riferimenti scende a zero. (In realtà, dovresti utilizzare std::shared_ptr
). O una GUI potrebbe avere una classe di finestre di dialogo in cui le istanze di dialogo dovrebbero essere eliminate quando l'utente la chiude.