Почему дизайн языка таков, что компилятор автоматически вставляет в деструктор вызов деструкторов других подобъектов, SuppressFinalize(this), но не вставляет вызов финалайзера? Ведь это нужно практически всегда, это можно забыть. Почему программист должен указаывать явно, что нужно делать почти всегда, а не наоборот — указывать явно что автоматический вызов финалайзера не нужен?
Насколько я понял из MSDN, кошерный паттерн такой —
ref class CMyClass: CMyClass3
{
~CMyClass()
{
this->!CMyClass();
вызываем delete(Dispose), Close, Free и тп. managed ресурсам, которыми мы владеем,
которые не являются подобъектами и автоматически не осводятся
}
!CMyClass()
{
освобождаем unmanaged ресурсы - объекты операционной системы/сторонних либ на С/ручной delete.
}
};
Если бы финалайзер вызывался автоматически, то деструкторы можно бы вообще не писать, пользоваться сгенерированными по-умолчанию.
Если я забуду для ref-класса сделать деструктор виртуальным, это плохо или нет? Проверил, вроде бы вызывается и деструктор потомка тоже.
Двойной вызов деструктора — UB или нет?
PS. Как по-русски — финалайзер? Про деструктор вроде уже договорились ^_^
Правильно работающая программа — просто частный случай Undefined Behavior
Re: C++/CLI: Почему в деструктор не вставляется финалайзер?
Здравствуйте, _Winnie, Вы писали:
_W>Почему дизайн языка таков, что компилятор автоматически вставляет в деструктор вызов деструкторов других подобъектов, SuppressFinalize(this), но не вставляет вызов финалайзера? Ведь это нужно практически всегда, это можно забыть. Почему программист должен указаывать явно, что нужно делать почти всегда, а не наоборот — указывать явно что автоматический вызов финалайзера не нужен?
Потому что это не всегда нужно, "pay as you go" остался в силе. Или представь так было бы по-умолчанию, а тебе нужно другое поведение, как бы ты выкрутился? Так что ИМХО всё правильно.
_W>Если бы финалайзер вызывался автоматически, то деструкторы можно бы вообще не писать, пользоваться сгенерированными по-умолчанию.
Не все классы должны быть IDisposable, поэтому только ручками.
_W>Если я забуду для ref-класса сделать деструктор виртуальным, это плохо или нет? Проверил, вроде бы вызывается и деструктор потомка тоже. но ИМХО это зря, но в эру .NETа и не такую защиту от дурака сделают. С драфте пока не нашел.
_W>Двойной вызов деструктора — UB или нет?
В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.
_W>PS. Как по-русски — финалайзер? Про деструктор вроде уже договорились ^_^
А как бы ты хотел? По-моему нормально
Скачайте драфт стандарта C++/CLI — эт бесплатно и законно, я это сделал с сайта Саттера.
Re[2]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, _Winnie, Вы писали: _W>>Двойной вызов деструктора — UB или нет? PC>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.
Здравствуйте, night_beast, Вы писали:
_>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>Здравствуйте, _Winnie, Вы писали: _W>>>Двойной вызов деструктора — UB или нет? PC>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.
_> или я тебя не понял, или одно из двух
для ref-классов...
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, night_beast, Вы писали:
_>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>Здравствуйте, _Winnie, Вы писали: _W>>>>Двойной вызов деструктора — UB или нет? PC>>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.
_>> или я тебя не понял, или одно из двух PC>для ref-классов...
а в стандарте с++ есть ref-классы?
Re[5]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, night_beast, Вы писали:
_>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>Здравствуйте, night_beast, Вы писали:
_>>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>>Здравствуйте, _Winnie, Вы писали: _W>>>>>Двойной вызов деструктора — UB или нет? PC>>>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.
_>>> или я тебя не понял, или одно из двух PC>>для ref-классов...
_>а в стандарте с++ есть ref-классы?
в догонку: кто занимается стандартизацией c++/cli?
PS: как то непонятно рсдн сообщения на почту отправляет
Re[6]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, night_beast, Вы писали: _>Здравствуйте, night_beast, Вы писали: _>>Здравствуйте, Pavel Chikulaev, Вы писали: PC>>>Здравствуйте, night_beast, Вы писали: _>>>>Здравствуйте, Pavel Chikulaev, Вы писали: PC>>>>>Здравствуйте, _Winnie, Вы писали:
_>>а в стандарте с++ есть ref-классы? _>в догонку: кто занимается стандартизацией c++/cli? _>PS: как то непонятно рсдн сообщения на почту отправляет
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, night_beast, Вы писали: _>>Здравствуйте, night_beast, Вы писали: _>>>Здравствуйте, Pavel Chikulaev, Вы писали: PC>>>>Здравствуйте, night_beast, Вы писали: _>>>>>Здравствуйте, Pavel Chikulaev, Вы писали: PC>>>>>>Здравствуйте, _Winnie, Вы писали:
_>>>а в стандарте с++ есть ref-классы? _>>в догонку: кто занимается стандартизацией c++/cli? _>>PS: как то непонятно рсдн сообщения на почту отправляет
_W>Ты кое-что пропустил — здесь
Здравствуйте, Centaur, Вы писали:
C>Вроде как устоявшимся переводом для ~[iy]zer является ~изатор. Инициализатор, рационализатор, анализатор. Соответственно, финализатор.
Зачем плодить в русском языке исковерканные слова из других языков, произнесенные неправильно? Файналайзер и всё тут! Зачем новые слова?
ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).
oops, я считал, что "джэмпер" — это одежда, а "джампер" — перемычка...
И кстати: мне тоже больше нравится "финализатор".
[надеюсь, что данный оффтоп никого сильно не обидит.]
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Pavel Chikulaev, Вы писали:
C>>Вроде как устоявшимся переводом для ~[iy]zer является ~изатор. Инициализатор, рационализатор, анализатор. Соответственно, финализатор. PC>Зачем плодить в русском языке исковерканные слова из других языков, произнесенные неправильно? PC>Файналайзер и всё тут! Зачем новые слова?
В таком случае изволь говорить «констрактор».
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Ash-2, Вы писали:
PC>>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper). A2>oops, я считал, что "джэмпер" — это одежда, а "джампер" — перемычка...
И то и то должно было быть "джампер"
[тоже надеюсь, что данный оффтоп никого сильно не обидит.]
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Centaur, Вы писали:
PC>>Файналайзер и всё тут! Зачем новые слова?
C>В таком случае изволь говорить «констрактор».
Я обычно так и говорю Слово конструктор появилось очень давно, и ничего плохо в нем в отличие от финализатора уже не слышно.
А лучше всего поступать как elescte — все термины по-английски — звучит очень профессионально
[sorry за оффтоп]
[или уже пора в "Священные войны" ???]
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).
Тут должен был по задумке стоят смайлик, но забыл Извини если что.
Re[5]: C++/CLI: Почему в деструктор не вставляется финалайзе
Здравствуйте, _Winnie, Вы писали:
_W>Насколько я понял из MSDN, кошерный паттерн такой -
_W>
_W>ref class CMyClass: CMyClass3
_W>{
_W> ~CMyClass()
_W> {
this->>!CMyClass();
_W> вызываем delete(Dispose), Close, Free и тп. managed ресурсам, которыми мы владеем,
_W> которые не являются подобъектами и автоматически не осводятся
_W> }
_W> !CMyClass()
_W> {
_W> освобождаем unmanaged ресурсы - объекты операционной системы/сторонних либ на С/ручной delete.
_W> }
_W>};
_W>
Придумал кое-что... интересная техника...
С++ программисты и так уже привыкли на автомате подбирать за собой мусор. Может, и не отвыкать, а финализатор использовать только для проверки, что действительно не забыли?
Говорят, что финализатор плохо сказывается на работе GC.
Здравствуйте, Pavel Chikulaev, Вы писали:
_W>>PS. Как по-русски — финалайзер? Про деструктор вроде уже договорились ^_^ PC>А как бы ты хотел? По-моему нормально
Тогда уж "файналайзер", а то как-то не по-русски получается...
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
It's kind of fun to do the impossible (Walt Disney)