Size: a a a

2021 March 26

Е

Евгений in dlang.ru
Там просто предостережение и пример вероятного косяка..
источник

OB

Oleg B in dlang.ru
Oleg B
допустим есть массив, ты его наполняешь, в какой-то момент хочешь убрать объект, что нужно сделать:
1. вызвать свой финализатор для объекта если таковое необходимо (close или makeInvalid или как ты его там назовёшь)
2. перезаписать массив без этого объекта, либо на место объекта записать null
свой финализатор нужен если у тебя есть бизнес логика, которую нужно исполнить перед удалением объекта (закрыть сокет, отправить сообщение), всё что касается памяти туда не входит
источник

Е

Евгений in dlang.ru
Почти всегда, в реальности, деструктор класса полезен тогда и только тогда, когда планируется уничтожать этот класс явно, через destroy, в остальных случаях деструктор бесполезен.
источник

OB

Oleg B in dlang.ru
Евгений
Может мой английский недостаточно хорош, но я не вижу тут утверждения, что деструктор может быть не вызван никогда.
https://dlang.org/spec/garbage.html#gc_config
cleanup:none|collect|finalize - how to treat live objects when terminating
collect: run a collection (the default for backward compatibility)
none: do nothing
finalize: all live objects are finalized unconditionally
источник

OB

Oleg B in dlang.ru
настраивается параметром
источник

OB

Oleg B in dlang.ru
можно запустить программу так, а можно не так
источник

OB

Oleg B in dlang.ru
итог: деструктор при завершении программы может быть вызван, а может и нет
источник

Е

Евгений in dlang.ru
Oleg B
можно запустить программу так, а можно не так
Ага, вот это уже понятнее. По умолчанию таки деструктит.
источник

OB

Oleg B in dlang.ru
вывод: полагаться на это не стоит
источник

Е

Евгений in dlang.ru
Oleg B
вывод: полагаться на это не стоит
Да даже если бы это было прибито гвоздями, все равно толку мало.
источник

OB

Oleg B in dlang.ru
Евгений
Почти всегда, в реальности, деструктор класса полезен тогда и только тогда, когда планируется уничтожать этот класс явно, через destroy, в остальных случаях деструктор бесполезен.
чревато необходимостью следить за всеми ссылками на объект
источник

Е

Евгений in dlang.ru
Oleg B
чревато необходимостью следить за всеми ссылками на объект
Ну так почти всегда, когда тебе нужен детерминизм деструкции, приходится следить за всеми ссылками (умные указатели, например). А если детерминизм не нужен, то как правило и деструктор не нужен.
источник

OB

Oleg B in dlang.ru
Евгений
Ну так почти всегда, когда тебе нужен детерминизм деструкции, приходится следить за всеми ссылками (умные указатели, например). А если детерминизм не нужен, то как правило и деструктор не нужен.
получается это уже не тривиальные случаи, требуют и внимания и понимания происходящего

при этом детерменизм бизнес-логики это не мешает обеспечивать (отсутствие деструктора)
источник

OB

Oleg B in dlang.ru
т.е. разницы нет вызовешь ли ты destroy или close, всё равно ты что-то будешь вызывать
источник

Е

Евгений in dlang.ru
Иногда мешает. Хотя, смотря что назвать бизнес логикой :)
источник

Е

Евгений in dlang.ru
Лично у меня никогда не возникало необходимости в деструкторе класса, если я не намерен его явно или через умный указатель уничтожить.
источник

OB

Oleg B in dlang.ru
Евгений
Иногда мешает. Хотя, смотря что назвать бизнес логикой :)
для меня бизнес-логика — решаемая программой задача, т.е. если будет меняться язык, платформа, парадигма, бизнес-логика будет неизменной
источник

Е

Евгений in dlang.ru
А у тебя?
источник

Е

Евгений in dlang.ru
Oleg B
для меня бизнес-логика — решаемая программой задача, т.е. если будет меняться язык, платформа, парадигма, бизнес-логика будет неизменной
Согласен.
источник

Е

Евгений in dlang.ru
Лично я вообще везде где не нужен полиморфизм использую структуры.
источник