Originariamente inviato da MItaly
Risposta breve: perché se no i gattini piangono.
Risposta lunga: perché è comunque buona pratica rilasciare correttamente tutte le risorse acquisite. Se poi quello che oggi è tutto il programma diventasse un pezzo di un programma più vasto, senza codice di cleanup si terrebbero impegnate per nulla delle risorse. Inoltre se una funzione alloca della memoria che non viene utilizzata ma non viene rilasciata quando non serve più (e quando non si hanno più puntatori ad essa) si hanno dei memory leaks: della memoria è allocata ma non è più accessibile né liberabile, il che si traduce in un'inutile occupazione di memoria e nella diminuzione delle prestazioni che ne consegue. Se poi si persegue in questo atteggiamento con risorse più limitate (handle kernel/GDI, file, risorse condivise, ...) si può andare incontro a problemi anche più gravi (file/risorse che rimangono bloccati inutilmente fino alla fine del programma, esaurimento degli handle GDI, ...).
In ogni caso la risposta al problema di gestione delle risorse in C++ è l'idioma
RAII, ossia Resource Acquisition Is Initialization; se impiegato correttamente nel tuo programma, hai la certezza che all'uscita di scope di una variabile che incapsula una risorsa (per causa di un'eccezione, per un return nella funzione, per una chiamata ad exit) la risorsa sarà rilasciata, dal momento che viene eseguito sicuramente* il distruttore dell'oggetto-risorsa.
*=salvo casi davvero eccezionali, quali una chiamata ad abort, la terminazione dall'esterno del processo e (mi pare) eccezioni SEH di Windows non gestite.