Berkus
мне было сказано что в этом случае не надо имплементировать дроп, но так и не было объяснено ПОЧЕМУ
Filipp
С телефона не удобно
Berkus
мне кажется это неправда, и дроп как раз надо имплементировать если мы хотим освобождать ресурс (любой, сишный, сокет что-то еще)
Berkus
а раст позовет дроп для полей если он у них реализован
Ivan
Berkus
не нужно для них реализоывывать Drop
Filipp
Нужно, но не энфорсится т.к. Ансейф
Berkus
вот же
Ivan
Filipp
Не нужно для успешной компиляции наверное
Berkus
причем я вижу в доке, что дроп/деаллок будет зваться в порядке обратном порядку объявления
Ivan
Для успешной компиляции понятно. Но не для корректного освобождения ресурсов
Filipp
Очевидно
Berkus
Filipp
Раст сам не будет дропать сишные структуры
Berkus
я про struct A который врапит какой-то сишный ресурс
Loo
я это написал
Loo
до того как вы начали говорить о сишных сокетах
Berkus
да, я вижу, ты написал
Berkus
не нужно для них реализоывывать Drop
Loo
это можно легко увидеть по истории сообщений
Ivan
Я правильно понимаю в расте нет утечек памяти, так как всё в умных указателях?
Mike
вызывается короч
Berkus
ну да, это логично
Filipp
Filipp
Ivan
Ну и мув семантика
Filipp
Можно mem::forget
Filipp
И все
Filipp
Ванлайнер
Ivan
Утечка?
Filipp
Да
Ivan
Еееее
Ivan
Возвращаюсь в с++
Filipp
Если ты до этого не сохранил сырой указатель чтобы потом ансейфно освободить
Filipp
Лол
Vladimir
@azoyan если у подструктур "нету дропа" у него есть "дроп по умолчанию" который вызовет дроп для дочерних структур. Но если у нас есть внутренний дескриптор, и мы аллоцируем ресурсы вручную, то этот дескриптор будет просто переменной чей дроп это освобождение памяти. В расте есть утечки памяти, у него даже функция есть для утечки, а умный указатель Rc может содержать циклическую ссылку и никогда не быть вызыван
Filipp
Mike
Ivan
Ясно. А почему они назвали деструктор drop'ом?
Ivan
А в документации написали Destructor
Mike
Mike
Ivan
Berkus
Destructor видимо это то что освобождает память, а Drop это хук перед вызовом деструктора
Ivan
У нас если его не реализовать, не значит что его нет.
Berkus
по плюсовому это что-то типа if (auto d = dynamic_cast<Drop>(a)) d->drop(); delete a;
Mike
Ivan
Berkus
Vladimir
Ну, то же делает drop() раста
Berkus
который mem::drop()?
Berkus
а не который Drop::drop()
Vladimir
Да
Vladimir
А Drop::drop() делает то же самое что деструктор
Vladimir
В С++
Ivan
То есть они просто новое название придумали
Vladimir
Ну я не думаю, что прям они.
Vladimir
Мне кажется, тут еще дело в том, что методы принято глаголами называть, А если использовать Destructor, то это было бы что-то типа
trait Destructor {
fn destruct(&mut self) //??
{...}
}
Ivan
trait Destruct {
fn destruct(&mut self) //??
{...}
}
Ivan
Нормально, в с++ знак инверсии ~ используют))
Ivan
Словами лучше
Vladimir
Ну уж знаки точно не нужно вводить, темболее в насте он уже был для тогдашних смарт указателей.
Ivan
Я не говорю знаки вводить
Ivan
Видимо слово Drop короче, вот его выбрали
Mike
Vladimir
Как по мне, то для нового юзера Drop звучит лучше, чем destructor. Это для с++ников кажется "они назвали деструктор по другому".
Vladimir
Mike
не
Mike
я к тому что глагол-то дестрой
Mike
а не destruct
Vladimir
а ну ок
Vladimir
Но еще хуже, как по мне
Mike
ну вот кстати да
Mike
в шарпах же Dispose и Finalize
Mike
так что тут каждый свои придумывает