domenica 2 dicembre 2012

Dichiarare un Dato che punta al suo Valore su Heap

Per dichiarare un membro dati che punta la suo valore su Heap, la prima cosa da fare è dichiarare il dato come un puntatore. Questo è ciò che viene fatto nella classe Roditore con la seguente linea di codice, la quale dichiara m_pNome come puntatore all'oggetto stringa.

String* m_pNome;
Nel costruttore della classe, viene allocata la memoria su heap, e assegnato un valore a tale memoria, quindi fissa il puntatore alla memoria. Questo è ciò che fa il costruttore con la seguente linea di istruzione, la quale assegna la memoria all'oggetto string, assegna un nome ad essa e punta m_pNome al blocco di memoria scelto.

m_pNome = new string(nome);
Quando main() chiama testDistruttore(), la funzione crea un oggetto Roditore. L'oggetto ha m_pNome come membro dati che punta all'oggetto stringa equivalente a “Topp”, memorizzato su heap.

Definire i Distruttori

Un distruttore è la funzione membro che viene chiamata subito prima che l'oggetto sia distrutto. I distruttori sono usati spesso dai programmatori per compiere una necessaria pulizia prima che l'oggetto scompaia per sempre. Il distruttore deve avere lo stesso nome della classe preceduto dal carattere tilde (~). Un distruttore non può avere parametri o restituire valori. Se non viene scritto dal programmatore, il compilatore ne aggiunge uno di base per supplire alla mancanza. Tuttavia il distruttore di default, quando si scrivono valori dei dati membro su heap è lacunoso; pertanto è necessario scrivere il proprio distruttore, in modo da liberare la memoria su heap associata all'oggetto prima che esso scompaia, evitando perdite di memoria. Questo è ciò che viene fatto per la classe Roditore.

~Roditore() //distruttore
{ cout << “Chiamata al distruttore\n”; delete m_pNome; }
Il distruttore mostra un messaggio e libera la memoria al quale puntava m_pNome. Da notare che non viene assegnato valore 0 a m_pNome, in quanto essa cessa di esistere dopo l'operazione di delete, viene evitato il pericolo di un puntatore appeso.

Nessun commento:

Posta un commento