Я собираюсь получить пламя из-за этого, но ...
C ++ лучше справляется с раскруткой стека, чем Java - конкурсов просто нет. Деструкторы объектов C ++ запускают весь процесс обратно в стек до тех пор, пока не будет достигнута точка захвата - все эти ресурсы будут плавно освобождены.
Как вы сказали, Java оставляет все это во власти недетерминированного сборщика мусора (наихудший случай) или в руках любого явно созданного блока finally, которым вы засоряли свой код (поскольку Java не поддерживает правда RAII). То есть весь код управления ресурсами находится в руках клиентов каждого класса, а не в руках дизайнера классов, где он должен быть.
Тем не менее, в C ++ механизм разматывания стека работает правильно только в том случае, если вы заботитесь о том, чтобы сами деструкторы не генерировали исключения. Если у вас есть два активных исключения, ваша программа abort()
без прохождения (и, конечно, без запуска любого из оставшихся деструкторов).