ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога в мае 2015 года .Спасибо за отличный вопрос!Смотрите в блоге длинный список лжи, о которых обычно думают люди о финализации.
Когда мне вручную создавать деструктор?
Почти никогда.
Обычно один создает деструктор только тогда, когда ваш класс держится за какой-то дорогой неуправляемый ресурс, который необходимо очистить, когда объект исчезнет.Лучше использовать одноразовый шаблон для обеспечения очистки ресурса.Деструктор, по сути, является гарантией того, что, если потребитель вашего объекта забудет его утилизировать, ресурс все равно будет очищен.(Возможно.)
Если вы создаете деструктор , будьте предельно осторожны и поймите, как работает сборщик мусора .Деструкторы действительно странные :
- Они не работают в вашем потоке;они бегут в своей собственной нити.Не вызывайте взаимоблокировок!
- Необработанное исключение, создаваемое деструктором, является плохой новостью.Это на своей собственной нити;кто его поймает?
- Деструктор может быть вызван для объекта после конструктора, но до конструктора.Правильно написанный деструктор не будет полагаться на инварианты, установленные в конструкторе.
- Деструктор может «воскресить» объект, снова оживив мертвый объект.Это действительно странно.Не делай этого.
- Деструктор никогда не сможет бежать;Вы не можете полагаться на объект, когда-либо запланированный для завершения.Это , вероятно, будет, но это не гарантия.
Почти все, что обычно верно, не является правдой в деструкторе.Будьте очень, очень осторожны.Написание правильного деструктора очень сложно.
Когда вам нужно было создать деструктор?
При тестировании части компилятора, которая обрабатывает деструкторы.Мне никогда не приходилось делать это в рабочем коде.Я редко пишу объекты, которые манипулируют неуправляемыми ресурсами.