Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Отчего же... Наоборот, хотят языковую поддержку для move constructors ввести. Это не "грабли", это "фича" — специальный способ указать на передачу владения. Если эта семантика не нужна, следует использовать другие указатели.
Нужно было просто не делать передачу владения неявной. И не пришлось бы тогда писать вумные книжки с советами наподобие "никогда не создавайте контейнеры из auto_ptr". Мне например кажется просто диким, что operator= изменяет свой правый аргумент.
И все-таки, возвращаясь к деструкторам. Допустим, Dispose бросает исключение. и часть объектов остались незавершенными. Однако завершение остальных объектов будет продолжаться.
С++ в аналогичной ситуации просто "умывает руки", и вообще отказывается освобождать ресурсы проги. Можно конечно попытаться это сделать из terminate, но я сомневаюсь, что из этого может получиться что-то путное. В семействе NT это не будет иметь катастрофических последствий, но то же самое нельзя сказать про ряд других ОС. Плюс к этому, прога может иметь ряд ресурсов, которые не управляются ОС — сеансы работы на сервере приложений, транзакции БД, например. Они конечно будут закрыты через некоторое время по таймауту, но за это время "повисшие" ресурсы могут парализовать работу ряда других юзеров. В результате такое поведение проги может вызвать неопределенное поведение в рамках всей операционной системы юзера, или в рамках корпоративной ИС
С этой точки зрения намного правильнее все-таки
попытаться освободить ресурсы, какие получится. И только после этого — может быть, завершить программу.