C++/CLI: Почему в деструктор не вставляется финалайзер?
От: _Winnie Россия C++.freerun
Дата: 20.11.05 23:06
Оценка:
Почему дизайн языка таков, что компилятор автоматически вставляет в деструктор вызов деструкторов других подобъектов, 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: Почему в деструктор не вставляется финалайзер?
От: Pavel Chikulaev Россия  
Дата: 21.11.05 07:36
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Почему дизайн языка таков, что компилятор автоматически вставляет в деструктор вызов деструкторов других подобъектов, SuppressFinalize(this), но не вставляет вызов финалайзера? Ведь это нужно практически всегда, это можно забыть. Почему программист должен указаывать явно, что нужно делать почти всегда, а не наоборот — указывать явно что автоматический вызов финалайзера не нужен?

Потому что это не всегда нужно, "pay as you go" остался в силе. Или представь так было бы по-умолчанию, а тебе нужно другое поведение, как бы ты выкрутился? Так что ИМХО всё правильно.

_W>Если бы финалайзер вызывался автоматически, то деструкторы можно бы вообще не писать, пользоваться сгенерированными по-умолчанию.

Не все классы должны быть IDisposable, поэтому только ручками.

_W>Если я забуду для ref-класса сделать деструктор виртуальным, это плохо или нет? Проверил, вроде бы вызывается и деструктор потомка тоже.

но ИМХО это зря, но в эру .NETа и не такую защиту от дурака сделают. С драфте пока не нашел.

_W>Двойной вызов деструктора — UB или нет?

В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.

_W>PS. Как по-русски — финалайзер? Про деструктор вроде уже договорились ^_^

А как бы ты хотел? По-моему нормально

Скачайте драфт стандарта C++/CLI — эт бесплатно и законно, я это сделал с сайта Саттера.
Re[2]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: night_beast СССР  
Дата: 21.11.05 08:18
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>Здравствуйте, _Winnie, Вы писали:

_W>>Двойной вызов деструктора — UB или нет?
PC>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.

или я тебя не понял, или одно из двух

struct test {
~test () { std::cout << "~test()" << std::endl; }
};

test t;
t.~test();
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Pavel Chikulaev Россия  
Дата: 21.11.05 08:26
Оценка:
Здравствуйте, night_beast, Вы писали:

_>Здравствуйте, Pavel Chikulaev, Вы писали:


PC>>Здравствуйте, _Winnie, Вы писали:

_W>>>Двойной вызов деструктора — UB или нет?
PC>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.

_> или я тебя не понял, или одно из двух

для ref-классов...
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: night_beast СССР  
Дата: 21.11.05 09:56
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>Здравствуйте, night_beast, Вы писали:


_>>Здравствуйте, Pavel Chikulaev, Вы писали:


PC>>>Здравствуйте, _Winnie, Вы писали:

_W>>>>Двойной вызов деструктора — UB или нет?
PC>>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.

_>> или я тебя не понял, или одно из двух

PC>для ref-классов...

а в стандарте с++ есть ref-классы?
Re[5]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: night_beast СССР  
Дата: 21.11.05 10:03
Оценка:
Здравствуйте, night_beast, Вы писали:

_>Здравствуйте, Pavel Chikulaev, Вы писали:


PC>>Здравствуйте, night_beast, Вы писали:


_>>>Здравствуйте, Pavel Chikulaev, Вы писали:


PC>>>>Здравствуйте, _Winnie, Вы писали:

_W>>>>>Двойной вызов деструктора — UB или нет?
PC>>>>В драфте не нашел, но-моему у тебя это даже не получится, явного вызова дтора нет.

_>>> или я тебя не понял, или одно из двух

PC>>для ref-классов...

_>а в стандарте с++ есть ref-классы?


в догонку: кто занимается стандартизацией c++/cli?

PS: как то непонятно рсдн сообщения на почту отправляет
Re[6]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: _Winnie Россия C++.freerun
Дата: 21.11.05 10:57
Оценка:
Здравствуйте, night_beast, Вы писали:
_>Здравствуйте, night_beast, Вы писали:
_>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>Здравствуйте, night_beast, Вы писали:
_>>>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>>>Здравствуйте, _Winnie, Вы писали:


_>>а в стандарте с++ есть ref-классы?

_>в догонку: кто занимается стандартизацией c++/cli?
_>PS: как то непонятно рсдн сообщения на почту отправляет

Ты кое-что пропустил — здесь
Автор: Pavel Dvorkin
Дата: 08.11.05
и еще есть стандарт на С++/CLI, никак сейчас не могу найти ни в MSDN, ни на RSDN ссылку
Правильно работающая программа — просто частный случай Undefined Behavior
Re[7]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: night_beast СССР  
Дата: 21.11.05 11:05
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, night_beast, Вы писали:

_>>Здравствуйте, night_beast, Вы писали:
_>>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>>Здравствуйте, night_beast, Вы писали:
_>>>>>Здравствуйте, Pavel Chikulaev, Вы писали:
PC>>>>>>Здравствуйте, _Winnie, Вы писали:


_>>>а в стандарте с++ есть ref-классы?

_>>в догонку: кто занимается стандартизацией c++/cli?
_>>PS: как то непонятно рсдн сообщения на почту отправляет

_W>Ты кое-что пропустил — здесь
Автор: Pavel Dvorkin
Дата: 08.11.05
и еще есть стандарт на С++/CLI, никак сейчас не могу найти ни в MSDN, ни на RSDN ссылку


ясно. значит проспал
а есть какие нибудь настройки, чтобы по умолчанию все сообщения на почту отсылались, а не только первое?
Re: C++/CLI: Почему в деструктор не вставляется финалайзер?
От: Centaur Россия  
Дата: 21.11.05 16:40
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>PS. Как по-русски — финалайзер? Про деструктор вроде уже договорились ^_^


Вроде как устоявшимся переводом для ~[iy]zer является ~изатор. Инициализатор, рационализатор, анализатор. Соответственно, финализатор.
Re[2]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Pavel Chikulaev Россия  
Дата: 21.11.05 16:54
Оценка: -1
Здравствуйте, Centaur, Вы писали:

C>Вроде как устоявшимся переводом для ~[iy]zer является ~изатор. Инициализатор, рационализатор, анализатор. Соответственно, финализатор.

Зачем плодить в русском языке исковерканные слова из других языков, произнесенные неправильно?
Файналайзер и всё тут! Зачем новые слова?

ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Ash-2 Россия  
Дата: 21.11.05 17:14
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).

oops, я считал, что "джэмпер" — это одежда, а "джампер" — перемычка...
И кстати: мне тоже больше нравится "финализатор".

[надеюсь, что данный оффтоп никого сильно не обидит.]
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Centaur Россия  
Дата: 21.11.05 17:21
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

C>>Вроде как устоявшимся переводом для ~[iy]zer является ~изатор. Инициализатор, рационализатор, анализатор. Соответственно, финализатор.

PC>Зачем плодить в русском языке исковерканные слова из других языков, произнесенные неправильно?
PC>Файналайзер и всё тут! Зачем новые слова?

В таком случае изволь говорить «констрактор».
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Pavel Chikulaev Россия  
Дата: 21.11.05 17:23
Оценка:
Здравствуйте, Ash-2, Вы писали:

PC>>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).

A2>oops, я считал, что "джэмпер" — это одежда, а "джампер" — перемычка...
И то и то должно было быть "джампер"

[тоже надеюсь, что данный оффтоп никого сильно не обидит.]
Re[4]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Pavel Chikulaev Россия  
Дата: 21.11.05 17:30
Оценка:
Здравствуйте, Centaur, Вы писали:

PC>>Файналайзер и всё тут! Зачем новые слова?


C>В таком случае изволь говорить «констрактор».

Я обычно так и говорю Слово конструктор появилось очень давно, и ничего плохо в нем в отличие от финализатора уже не слышно.
А лучше всего поступать как elescte — все термины по-английски — звучит очень профессионально

[sorry за оффтоп]
[или уже пора в "Священные войны" ???]
Re[3]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Pavel Chikulaev Россия  
Дата: 21.11.05 17:52
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

PC>ЗЫ Из-за таких как ты в русском языке появилось слово "джэмпер", хотя в оригинале "джампер" (jumper).

Тут должен был по задумке стоят смайлик, но забыл Извини если что.
Re[5]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: _Winnie Россия C++.freerun
Дата: 21.11.05 18:21
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, Centaur, Вы писали:

PC>[или уже пора в "Священные войны" ???]


Какие еще священные войны >_<
Вы лучше здесь
Автор: _Winnie
Дата: 21.11.05
ответьте.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: C++/CLI: Почему в деструктор не вставляется финалайзер?
От: _Winnie Россия C++.freerun
Дата: 21.11.05 20:23
Оценка:
Здравствуйте, _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.

#ifndef NDEBUG

#define DESTRUCTOR_NO_LEAK(TYPE)  \
CheckDestructorCalled m_check_destructor_called; \
!TYPE() { assert(m_check_destructor_called.m_destructor_called && "Забыли вызвать деструктор :("); } 

#else

#define DESTRUCTOR_NO_LEAK(TYPE) 

#endif

ref class MyClass
{
    ~MyClass()
    {
        //освобождаем ресурсы.
    }

    DESTRUCTOR_NO_LEAK(MyClass)
};
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: C++/CLI: Почему в деструктор не вставляется финалайзе
От: Alex Alexandrov США  
Дата: 21.11.05 20:50
Оценка:
Здравствуйте, 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.