ho intenzione di ottenere fiammato per questo, ma ...
C++ è senza dubbio meglio di Java nello stack rilassarsi davanti - non c'è proprio nessun concorso. I distruttori di oggetti C++ sparano su tutta la pila fino al raggiungimento del punto di cattura, rilasciando tutte le risorse gestite con grazia lungo la strada.
Come hai detto, Java lascia tutto questo in balia del garbage collector non deterministico (nel caso peggiore) o nelle mani di qualsiasi blocco finalmente creato appositamente per il codice (dal momento che Java non lo fa supporta il vero RAII). Cioè, tutto il codice di gestione delle risorse è nelle mani dei clienti di ogni classe, piuttosto che nelle mani del progettista di classe dove dovrebbe essere.
Detto questo, in C++, il meccanismo di srotolamento dello stack funziona correttamente solo se si fa attenzione a garantire che i distruttori stessi non emettano eccezioni. Una volta che hai due eccezioni attive, il tuo programma abort()
è senza passare (e ovviamente senza sparare a nessuno dei rimanenti distruttori).
fonte
2010-03-31 08:54:48
Soggettivo: definire "migliore". – razlebe
Java implementa un vero garbage collector, quindi in teoria non dovresti mai preoccuparti di un oggetto che non distrugge tutto ciò che crea sullo stack. Il C++ presume che tu stia attento. – thecoshman
Java implementa un _memory_ garbage collector. Di conseguenza, i file temporanei non vengono raccolti e possono essere trapelati da una pila. D'altra parte, nello stack C++ si sganciano i distruttori di chiamate, che oltre alla pulizia della memoria possono anche ripulire file temporanei e altre risorse. Quindi Java è più semplice e C++ più flessibile, un compromesso di progettazione standard. – MSalters