Distruttore.

Insieme al costruttore di classe, c'è anche un distruttore che esegue l'azione opposta: distrugge l'oggetto lo rimuove dalla memoria dinamica. Come un costruttore, un distruttore viene creato automaticamente se non ne specifichi uno esplicitamente. Il distruttore può anche essere dichiarato in modo indipendente, per eseguire alcune azioni quando la classe viene distrutta, ad esempio per liberare memoria dinamica. Un distruttore viene dichiarato esattamente allo stesso modo di un costruttore, ad es. il nome è lo stesso del nome della classe, non esiste un tipo di dati di ritorno. L'unica differenza è la tilde ~ davanti al nome. Considera una classe, il distruttore sarà ~Color(); Se crei un oggetto al di fuori delle funzioni, verrà creato globalmente ed esisterà per tutta la durata del programma. Se lo crei all'interno di una funzione o di un blocco di codice, esisterà solo all'interno di questo blocco, ovvero le variabili di classe occuperanno memoria durante l'esecuzione di questo blocco di codice. Considera questa classe:
class Color // classe Color
     public: 
          Color()  // costruttore
           {
          };  
          void printHello() 
          { 
               Serial.println("Hello"); 
          }; 
          ~Color() // distruttore
           
               Serial.println("destruct"); 
          }; 
          byte someVar; // variabile 
     private:
};
Ha un costruttore vuoto che stampa il metodo hello e un distruttore. Eseguiamo il seguente codice:
Color myColor3;
void setup() 
     Serial.begin(9600); 
     myColor3.printHello();
}
Nell'output del port vedremo Hello e basta, perché l'oggetto è globale e il distruttore non è stato chiamato durante il funzionamento, perché l'oggetto non è stato distrutto. Aggiungiamo la creazione di oggetti al blocco funzione setup() e vediamo cosa succede. 
void setup() 
     Serial.begin(9600); 
     Color myColor3; 
     myColor3.printHello();
}
L'oggetto è stato creato all'interno della funzione, e quando si esce da questa funzione, cioè subito dopo essere passati attraverso la parentesi graffa di chiusura {, l'oggetto verrà distrutto, verrà chiamato il distruttore e nella porta seriale stamperà "destruct".
Come e perché applicarlo in pratica: se la memoria è allocata all'interno dell'oggetto per alcune azioni, sarebbe bene liberare questa memoria nel distruttore. Ad esempio, considera la classe String standard, i cui oggetti - stringhe con caratteri, si trovano nella memoria dinamica e se crei una stringa localmente, viene distrutta dopo l'uscita dal suo blocco funzione, perché è scritta nel distruttore:
String::~String()
     free(buffer);
} 
Crea il tuo sito web gratis! Questo sito è stato creato con Webnode. Crea il tuo sito gratuito oggi stesso! Inizia