Usando cancellalo per liberare memoria in classe

-9

Ogni volta che scriviamo i distruttori in C ++ (anche se questo concetto potrebbe applicarsi in altre lingue) potremmo semplicemente non scrivere

delete this;

e cancellerebbe qualsiasi dato all'interno della classe? Questa è una buona o cattiva idea? Se è male, non cancellerebbe tutta la memoria che avevamo allocato all'oggetto?

    
posta bkeys 03.10.2015 - 06:33
fonte

1 risposta

4

Che cosa fa un % espressione didelete fare?

  1. Invoca il distruttore sui dati puntati.
  2. 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.

    
risposta data 03.10.2015 - 10:42
fonte

Leggi altre domande sui tag