TL; DR вы делаете это неправильно.
преобразование необработанного указателя в ссылку
Нет, вы преобразовываете его в Box
, не ссылка.
программа работает нормально
Это не так.Вам просто «повезло», что небезопасная память и неопределенное поведение не вызывают сбой.Вероятно, это связано с тем, что ваш тип не имеет фактических данных.
для ссылки, деструктор должен вызываться автоматически
Нет, когда ссылки выходятобласти видимости, деструктор не выполняется.
Почему деструктор не называется
Это равно , что является одной из нескольких причин, по которым вашкод полностью и полностью сломан и небезопасен.
Добавьте код, который будет запускаться при уничтожении:
impl Drop for ABC {
fn drop(&mut self) {
println!("drop")
}
}
И вы увидите, что он вызывается 3 раза:
Inside handle 1
drop
Inside handle 2
drop
drop
Я могу получить доступ к ссылке на ABC
Да, что небезопасно.Вы нарушаете правила, которые должны соблюдать при написании кода unsafe
.Вы взяли необработанный указатель, сделали что-то, чтобы сделать его недействительным, и затем обращаетесь к исходной, теперь недопустимой переменной.
В документации также говорится:
единственный действительный указатель для передачи этой функции - тот, который взят из другого Box
через функцию Box::into_raw
.
Вы также игнорируете этот аспект.