Newsgroup: it.comp.lang.c++
Titolo: Deallocazione al termine di un programma

Salve a tutti.
Vorrei sapere se la memoria allocata sullo heap viene rilasciata nel
caso in cui:
 - il programma termina correttamente
 - il programma termina con un errore (tipo segmentation fault)
 - il programma termina dopo l'invocazione di exit (-1) o exit (1)
Grazie


Rilasciata da chi?
Kiuhnm

> Rilasciata da chi?
Dal sistema operativo, credo.
Riformulo la domanda:
  cosa accade alla memoria allocata con new nei tre casi del post
sopra?

se il processo termina e se il sistema operativo è scritto bene dovrebbe 
riprendersela
Boe Szyslak ha scritto:


 Dal sistema operativo, credo.
Allora sei chiaramente OT ed è comunque impossibile risponderti.
Kiuhnm

 Allora sei chiaramente OT ed è comunque impossibile risponderti.
Scusate, credo di non essermi spiegato bene.
  ora ri-riformulo la domanda
  se all'interno del mio programma scrivo
                       int * c = new int(3);
prima della terminazione devo dare anche
                     delete c;
per evitare la persistenza di garbage sullo heap?

Boe Szyslak ha scritto:

Per pulizia si  ma se non la fai ed il programma termina ... il sistema 
operativo
dealloca di sicuro il data segment del processo. (per il code segment 
non è detto
in quanto potrebbe essere condivisa tra + istanze dello stesso processo )

Boe Szyslak ha scritto:

In linea di principio il sistema operativo dovrebbe sempre e comunque 
essere in grado di risalire a tutta la memoria associata a un dato 
processo, heap, stack o globale allocata successivamente: per cui, 
sempre in linea di principio, quando il programma termina tutta la 
memoria da esso allocata dovrebbe poter venire liberata (salvo che il 
programma stesso non abbia provveduto a dare indicazioni contrarie in 
proposito).
Il fatto che ciņ a volte non succeda mi riempie di curiositą, perchč non 
riesco a immaginare un motivo per cui il S.O., di sua sponte e senza 
altre indicazioni, trovi conveniente lasciare allocata la memoria di un 
processo defunto...

 processo defunto...
L'OS fa quello che è stato programmato a fare, non quello che è più 
conveniente. Inoltre quasi ogni OS crasha se testato con software che 
generano file eseguibili a caso, mentre in teoria non dovrebbe.
Kiuhnm

caso in cui:
Sì, normalmente viene rilasciata (almeno con i sistemi Windows e
Unix/Linux).  A livello più basso, l'allocazione/deallocazione della
memoria ricorre all'API del sistema operativo, che ha il controllo dei
blocchi di memoria allocati.  Quando i processi terminano, la memoria
da essi allocata viene liberata.  Questo significa che se non
deallochi la memoria prima che la tua applicazione si spenga, è sicuro
che il sistema la renderà nuovamente disponibile; è tuttavia
importante imparare a gestire in modo corretto la memoria (i.e.:
allocazioni con relative deallocazioni nei punti giusti), per
acquisire una tecnica standard di sviluppo, che tenga lontani dai
problemi.  I problemi di ingrossamento dello spazio allocato si
riscontrano molto frequentemente nelle applicazioni server, che stanno
in piedi per molto tempo
p.s.: non sei OT.

generano file eseguibili a caso, mentre in teoria non dovrebbe.
Eh ?

Allora sei chiaramente OT ed è comunque impossibile risponderti.
Veramente non lo è.

Andrea Laforgia ha scritto:

Rileggiti il manifesto.
In particolare:
"Il newsgroup non tratta più argomenti specifici di piattaforme
hardware/software..."
-- 
Roal Zanazzi

Andrea Laforgia ha scritto:

E se stai rispondendo alla seconda affermazione di Kiuhnm:
ha ragione Kiuhnm, non e' possibile rispondere senza sapere di quale 
sistema operativo si discute.
E nel momento stesso in cui si specifica il sistema operativo si ricade 
nella prima affermazione: la domanda e' OT.
-- 
Roal Zanazzi

Rileggiti il manifesto.
Il manifesto lo conosco quasi a memoria, visto che frequento il ng da
una decina d'anni.  Vedi l'altro messaggio per la risposta.

nella prima affermazione: la domanda e' OT.
L'OP non ha citato alcun sistema operativo preciso.  Non è OT.
Se avesse chiesto, in particolare, come funziona la VirtualAlloc() di
Windows, allora sarebbe stato OT.

 Windows, allora sarebbe stato OT.
 >
Non capisco se sono io a non scrivere in modo chiaro o sei tu ad 
interpretare i messaggi nel modo che piu' ti sia comodo per dare sempre 
e comunque torto agli altri.
Vediamo se riesco a farmi capire con parole piu' semplici...
La domanda dell'OP (il suo primo post) non era OT (nessuno in questo 
thread l'ha mai scritto).
Tant'e' che Kiuhnm ha chiesto una precisazione: "(memoria) Rilasciata da 
chi?", proprio (suppongo) per capire se la tematica fosse IT o no.
Io ho scritto: "nel momento stesso in cui si specifica il sistema 
operativo, la domanda e' OT"
E tu hai scritto "Se avesse chiesto come funziona la VirtualAlloc() di 
Windows, allora sarebbe stato OT", ossia: se avesse specificato il 
sistema operativo sarebbe stato OT.
Che e' esattamente la stessa affermazione formulata in modo (non molto) 
differente.
Questa discussione e' sterile e non aggiunge informazioni utili al 
thread ne' giova in alcun modo gli altri partecipanti al NG, quindi per 
quanto mi riguarda e' chiusa.
-- 
Roal Zanazzi

 generano file eseguibili a caso, mentre in teoria non dovrebbe.
Eh?
Otto Disc

 Eh?
Mi è capito di leggere una pubblicazione sulla sicurezza che parlava di 
vari esperimenti condotti da un team di ricercatori per testare la 
robustezza delle varie applicazioni. I risultati sono stati alquanto 
disastrosi in quanto 99 su 100 sono risultate instabili. Sono stati 
testati vari sistemi operativi generando eseguibili contenenti codice 
random. Quasi tutti gli OS sono crashati nel giro di ore.
Il problema risiede anche nel fatto che l'architettura IA-32(-64?) non è 
completamente sicura. Questo è un problema con cui dovrò fare i conti 
tra un anno.
Kiuhnm

quanto mi riguarda e' chiusa.
Meglio cosě, perché hai sollevato un polverone estremamente sterile e
lo scricchiolio delle tue unghie sullo specchio comincia a dar
fastidio ;-)