Почему деструкторы запускаются при возникновении паники?

Если программа на Rust паникует и предполагая, что нет никаких ловушек паники (которых некоторое время не было), конечно, было бы безопасно и нормально не запускать деструкторы, а просто позволить ОС очиститься после процесса. Почему Rust раскручивает нить?

Единственная причина, о которой я могу думать, - это когда нет ОС для восстановления памяти, но, кроме этой ниши, это кажется ненужным.


person Timidger    schedule 18.09.2017    source источник
comment
Вы можете захотеть, чтобы деструкторы сохраняли вещи, особенно если что-то пошло не так.   -  person lilezek    schedule 18.09.2017
comment
И это полезно для отладки. Обратная трассировка может помочь вам понять, что пошло не так.   -  person Peter Hall    schedule 18.09.2017
comment
@lilezek: На самом деле ... вам, вероятно, НЕ следует полагаться на деструкторы для сохранения вещей. Программа может быть прервана, аварийно завершена, может быть убита операционной системой... и в любом из этих случаев деструкторы никогда не запустятся. В контексте завершения программы деструкторы могут использоваться только для реализации операций с максимальной эффективностью и НЕ должны использоваться для реализации обязательных операций. Если вы хотите иметь возможность возобновить работу с того места, где вы были, вам необходимо регулярно сохранять свой прогресс во время обычного выполнения (с помощью атомарного переключателя, если во время сохранения произойдет сбой...).   -  person Matthieu M.    schedule 18.09.2017
comment
@MatthieuM. Когда я сказал сохранять вещи, я имел в виду такие вещи, как отладочная информация, состояния сокетов TCP... Я не имел в виду полагаться на деструкторы для сохранения вещей на диск (это может даже повредить некоторые уже сохраненные данные).   -  person lilezek    schedule 18.09.2017
comment
@lilezek: я рад, что мы согласны :) (к сожалению, я был на принимающей стороне, давайте использовать деструктор для восстановления состояния в попытке базы данных, и потратил дни, пытаясь исправить ущерб)   -  person Matthieu M.    schedule 18.09.2017
comment
Начиная с Rust 1.0 можно было поймать панику между потоками (см. JoinHandle::join).   -  person Francis Gagné    schedule 19.09.2017


Ответы (2)


В вашем вопросе есть ошибочная предпосылка: предполагается, что единственная причина использования деструктора - это очистка ресурсов текущего процесса.

Это, действительно, наиболее распространенное использование, но оно не единственное.

Например, я вполне мог себе представить, что деструктор TCP-соединения попытается отправить сообщение о закрытии: чем быстрее будет закрыто соединение, тем быстрее будут освобождены ресурсы на другом конце. Конечно, это только лучшее усилие (в случае прерывания/сбоя деструктор никогда не запускается), но оно все же может быть полезным.

person Matthieu M.    schedule 18.09.2017

Если программа Rust паникует [...], просто дайте ОС очиститься после процесса.

Когда в потоке возникает паника, нет необходимости завершать весь процесс. В этих случаях хорошо, что деструктор запускается.

В других случаях реализация Drop используется для выполнения «отката» некоторого критического участка кода.

при условии, что улавливателей паники нет (которых некоторое время не было)

Но теперь есть, так что непонятно, зачем вы это поднимаете.

person Shepmaster    schedule 18.09.2017