Me voy a conseguir flameado para esto, pero ...
C++ es sin duda mejor que la de Java en la pila relajarse delante - simplemente no hay competencia. Los destructores de objetos de C++ disparan hasta la parte posterior de la pila hasta que se alcanza el punto de captura, liberando todos los recursos gestionados correctamente a lo largo del camino.
Como dijiste, Java deja todo esto a merced del recolector de basura no determinista (el peor de los casos) o en manos de los bloques finalmente creados explícitamente con los que has rellenado tu código (ya que Java no soporte verdadero RAII). Es decir, todo el código de administración de recursos está en manos de los clientes de cada clase, en lugar de estar en manos del diseñador de clases donde debería estar.
Dicho esto, en C++, el mecanismo de desenrollado de la pila solo funciona correctamente si se cuida de garantizar que los propios destructores no emitan excepciones. Una vez que tienes dos excepciones activas, tu programa abort()
's pasa sin pasar (y por supuesto sin disparar ninguno de los destructores restantes).
Subjetivo: defina "mejor". – razlebe
Java implementa un recolector de basura adecuado, por lo que, en teoría, nunca deberías preocuparte de que un objeto no destruya todo lo que crea en la pila. C++ supone que estás siendo cuidadoso. – thecoshman
Java implementa un recolector de basura _memory_. Los archivos temporales no se recogen como basura, y como resultado se pueden filtrar por una pila que se desenrolla. Por otro lado, en C++ el desenrollado de la pila llama a los destructores, que además de la limpieza de la memoria también pueden limpiar los archivos temporales y otros recursos. Así que Java es más fácil y C++ más flexible, una compensación de ingeniería estándar. – MSalters