Overloading degli operatori New e Delete in C++
Pagina 1 di 2
Tra le caratteristiche distintive del linguaggio C++ rispetto ad altri linguaggi di programmazione, individuiamo senz'altro la possibilità di estendere l'utilizzo del meccanismo di overloading anche agli operatori, oltre che alle funzioni o ai metodi di una classe.
In estrema sintesi, l'overloading è, in generale, un meccanismo che consente di differenziare funzioni con lo stesso nome (e di solito uno scopo simile ma non identico) sulla base del numero e della tipologia di parametri forniti.
Ad esempio, potrei definire due funzioni di stampa, una generica (senza parametri) che stampa una serie di informazioni prefissata, e un'altra in cui l'utente è in grado di specificare, impostando opportunamente alcuni parametri, quali sono le informazioni di interesse e dunque da stampare.
La funzione di stampa viene, quindi, in questo caso ridefinita per adattarsi alle diverse informazioni fornite in input dall'utente. In modo analogo il C++ consente di ridefinire anche gli operatori: pensiamo agli operatori matematici "+", "-", "*" e "/". Può essere interessante e pratico, ad esempio, ridefinire l'operatore "+" nel caso in cui sia applicato non a numeri, ma a stringhe (insiemi di caratteri alfanumerici). In quest'ultimo caso la "somma" delle stringhe corrisponderà alla concatenazione, ad esempio se la stringa a corrisponde a "Ciao " e la stringa b a "mondo", l'operazione
string c=a+bporterà alla creazione della stringa c, il cui valore sarà "Ciao mondo".
L'overloading, e in particolare l'overloading degli operatori in C++, sono comunque stati trattati in un precedente articolo, a cui rimandiamo per ulteriori approfondimenti.
Ci proponiamo ora di valutare, invece, in modo specifico come questo stesso meccanismo possa essere esteso anche ad altri tipi di operatori e con quale utilità, in particolare facendo riferimento agli operatori new e delete, utili per la gestione della memoria.
Gestione della memoria
Gli operatori new e delete sono utili per la gestione della memoria, in particolare per riservare e assegnare (o allocare) la memoria necessaria per un nuovo oggetto (new) e per liberare (o deallocare) tale memoria per futuro utilizzo (delete).
Un aspetto molto interessante del C++, che lo distingue dal C, è proprio l'esistenza di new e delete, che consentono, ad esempio per quanto riguarda new, di eseguire il calcolo dello spazio necessario per ciascun oggetto in modo automatico (mentre il comando equivalente in C, malloc, impone al programmatore di specificare qual è la dimensione dell'oggetto da allocare).
Risulta naturale a questo punto chiedersi quale possa essere l'utilità di un meccanismo di overloading, dato che il punto di forza di new e delete è proprio una grandissima generalità di utilizzo, che pare rendere non necessaria una ridefinizione che tenga conto di diversi casi. Il prezzo di un operatore così generico è, però, come spesso accade, una certa mancanza nel controllo dell'esecuzione. Ad esempio, non è possibile, servendosi della versione di default dell'operatore new, verificare con semplicità se ci siano stati problemi nell'allocazione della memoria necessaria (la memoria è disponibile? è stata allocata correttamente?). Per ovviare a questo problema si può ricorrere proprio all'overloading.
Tratteremo dunque ora, con un semplice esempio, un caso di overloading dell'operatore new, sottolineando come le considerazioni fornite e le procedure indicate siano valide anche se si desidera effettuare overloading rispetto all'operatore delete.







