Berkus
мне было сказано что в этом случае не надо имплементировать дроп, но так и не было объяснено ПОЧЕМУ
Filipp
С телефона не удобно
Berkus
мне кажется это неправда, и дроп как раз надо имплементировать если мы хотим освобождать ресурс (любой, сишный, сокет что-то еще)
Berkus
а раст позовет дроп для полей если он у них реализован
Berkus
не нужно для них реализоывывать Drop
Filipp
Нужно, но не энфорсится т.к. Ансейф
Berkus
вот же
Ivan
вот же
Он мог ошибиться
Filipp
Не нужно для успешной компиляции наверное
Berkus
причем я вижу в доке, что дроп/деаллок будет зваться в порядке обратном порядку объявления
Ivan
Для успешной компиляции понятно. Но не для корректного освобождения ресурсов
Filipp
Очевидно
Berkus
Не нужно для успешной компиляции наверное
ну мы про успешный рантайм говорим
Filipp
Раст сам не будет дропать сишные структуры
Berkus
я про struct A который врапит какой-то сишный ресурс
Loo
я это написал
Loo
до того как вы начали говорить о сишных сокетах
Berkus
да, я вижу, ты написал
Berkus
не нужно для них реализоывывать Drop
Loo
это можно легко увидеть по истории сообщений
Ivan
Я правильно понимаю в расте нет утечек памяти, так как всё в умных указателях?
Mike
Может кто-нибудь набрать?
https://play.rust-lang.org/?gist=a2cb1282a4d324dcb29e976f38d173c5&version=stable
Mike
вызывается короч
Berkus
ну да, это логично
Ivan
Ну и мув семантика
Filipp
Можно mem::forget
Filipp
И все
Filipp
Ванлайнер
Ivan
Утечка?
Filipp
Да
Ivan
Еееее
Ivan
Возвращаюсь в с++
Filipp
Если ты до этого не сохранил сырой указатель чтобы потом ансейфно освободить
Filipp
Лол
Vladimir
@azoyan если у подструктур "нету дропа" у него есть "дроп по умолчанию" который вызовет дроп для дочерних структур. Но если у нас есть внутренний дескриптор, и мы аллоцируем ресурсы вручную, то этот дескриптор будет просто переменной чей дроп это освобождение памяти. В расте есть утечки памяти, у него даже функция есть для утечки, а умный указатель Rc может содержать циклическую ссылку и никогда не быть вызыван
Ivan
Ясно. А почему они назвали деструктор drop'ом?
Ivan
А в документации написали Destructor
Mike
А в документации написали Destructor
птому что это не синонимы
Vladimir
ну для циклических ссылок же и придумали слабые и сильные указатели, не?
Но никто не запретит тебе сделать цикл с "сильными" ссылками.
Berkus
Destructor видимо это то что освобождает память, а Drop это хук перед вызовом деструктора
Ivan
У нас если его не реализовать, не значит что его нет.
Berkus
по плюсовому это что-то типа if (auto d = dynamic_cast<Drop>(a)) d->drop(); delete a;
Vladimir
по плюсовому это что-то типа if (auto d = dynamic_cast<Drop>(a)) d->drop(); delete a;
Ну вообще плюсовый диструктор вроде как не очищает память, т.е. тебе не надо явно делать delete this.
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 короче, вот его выбрали
Vladimir
Как по мне, то для нового юзера Drop звучит лучше, чем destructor. Это для с++ников кажется "они назвали деструктор по другому".
Vladimir
destroy =)
finalize
Mike
не
Mike
я к тому что глагол-то дестрой
Mike
а не destruct
Vladimir
а ну ок
Vladimir
Но еще хуже, как по мне
Mike
ну вот кстати да
Mike
в шарпах же Dispose и Finalize
Mike
так что тут каждый свои придумывает
Berkus
в шарпах же Dispose и Finalize
причем они вроде не деструкторы, а немного по-другому