Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сборщик мусора / 16 сообщений из 16, страница 1 из 1
04.10.2013, 15:01
    #38416915
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
Добрый день ! ! !

если , допустим в C++, у меня есть производный класс. и есть объект этого класса.
то конструкторы вызываются от базового к производному, тогда как деструкторы наоборот.

Теперь в языке C# есть сборщик мусора, который освобождает память . Допустим наш объект производного класса стал не нужен и потом вызвался сборщик мусора, как он узнает, что ему надо с начало поработать с объектом производного класса? т е есть ли у него список созданных объектов или он в произвольном порядке их уничтожает? допустим если есть 2 объекта одного и того же класса. то какой первым он удалит, при усл что ссылок на обоих нет на момент его вызова? в обратном порядке их вызова конструкторов или произвольно?
...
Рейтинг: 0 / 0
04.10.2013, 16:06
    #38417050
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
не понятен вопрос автор допустим если есть 2 объекта одного и того же класса. то какой первым он удалит
очевидно тот который первым встанет в очередь на удаление..
...
Рейтинг: 0 / 0
04.10.2013, 19:33
    #38417370
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
Где-то в степиmr.davidos,
не понятен вопрос автор допустим если есть 2 объекта одного и того же класса. то какой первым он удалит
очевидно тот который первым встанет в очередь на удаление..


перед удалением объекта вызовется его деструктор( если он написан). т е в C# вызов дестрктора будет произвольный?
не в обратном порядке вызова конструктора( как в C++) ??
...
Рейтинг: 0 / 0
04.10.2013, 20:03
    #38417389
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
немножко терминов по другому, финализатор,
это обычный метод который принято соглашение обозначать лямбдой,название по типу и меть приватный,
от других методов его ничего не отличает, впрочем отличает, компилятор оборачивает его в try- cath ибо он должен
всегда исполниться без исключения, сборщик выбирает объекты у которых он определен, и помещает их в отдельную очередь
ну это не к вопросу. так вот если базовый и тип который наследует базовый имеют финализатор ( имеют методы с одинаковым названием), обращение к ним идет
по старшинству, если на сях старшим считается базовый до в диезе наоборот, вроде так, сама реализация логики в этих
финализаторах должна быть локальной к типу где она реализуется не более ( можем получить оживление объекта, или обращение
к уже удаленному), в базовых типах, что бы не реализовывать огород, в патерне диспозе Dispose(bool disposing) - виртуальный т.е. можно перегрузить ,можно смастерить заглушку в базовом..OnDisposе(), но реализовывать финализатор в обеих типах грешно..
...
Рейтинг: 0 / 0
04.10.2013, 20:09
    #38417395
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
скажем так, очередность - абсолютно до фонаря, ибо правильно написанный ф. должен всегда исполниться
...
Рейтинг: 0 / 0
04.10.2013, 20:13
    #38417399
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
и еще дополню, реализовывать финализатор без IDisposable, имхо - кощунство..
...
Рейтинг: 0 / 0
04.10.2013, 20:33
    #38417412
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
пожалуй изменю свое мнение ( хороший вопрос) так как такое дело я никогда не делал. сделал тестовый пример, и получилось
что компилятор в финализаторе наследуемого класса, зашил вызов финализатора базового класса, то есть очередность
как я сказал, а причина - вызов в стеке
...
Рейтинг: 0 / 0
04.10.2013, 20:57
    #38417421
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
Где-то в степиmr.davidos,
пожалуй изменю свое мнение ( хороший вопрос) так как такое дело я никогда не делал. сделал тестовый пример, и получилось
что компилятор в финализаторе наследуемого класса, зашил вызов финализатора базового класса, то есть очередность
как я сказал, а причина - вызов в стеке

А Вам не кажется, что на самом деле, если происходит вызов конструктора базового класса в списке инциализации конструктора производного, класса, то уже создан подобъект базового класса, для инциализации тех полей, которые были получены в ходе наследования, а раз есть объект , то он должен иметь время жизни, а так как работа с этим подобъектом строится на основе ссылки ( она без имени), то и значит когда мы потеряем ссылку на объект производного класса, он станет просто кандидатом для удаления и так как он хранит еще и ссылку на подобъект своего базового класса, то на основе этого и происходит вызов финализатора объекта базового и ее удаление. Просто он когда удаляет объект, наверное просто ищет в полях этого объекта ссылки на другие объекты и их тоже удаляет. я правильно понимаю?? ушел читать Рихтера))))))))
...
Рейтинг: 0 / 0
04.10.2013, 21:10
    #38417434
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
class First
{
~First()
{
System.Diagnostics.Trace.WriteLine("First's destructor is called.");
}
}

class Second : First
{
~Second()
{
System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
}
}

class Third : Second
{
~Third()
{
System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
}
}

class TestDestructors
{
static void Main()
{
Third t = new Third();
}

}
/* Output (to VS Output Window):
Third's destructor is called.
Second's destructor is called.
First's destructor is called.
*/
...
Рейтинг: 0 / 0
04.10.2013, 21:15
    #38417436
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos, немного не понял, выделение памяти и инициализация происходит при new, а конструктор это простой метод
где происходит пользовательская инициализация, когда он вызывается объект уже создан и то что сначала вызывается базовый, а потом производный, имхо иллюзия, вызов базового зашит в самом верху стека производного, и если произойдет исключение
просто не сработает механизм передачи ссылки, а сам объект никуда не девается он просто кандидат на удаления..
...
Рейтинг: 0 / 0
04.10.2013, 21:19
    #38417437
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
автор/* Output (to VS Output Window):
Third's destructor is called.
Second's destructor is called.
First's destructor is called.
*/

все верно, вызывается деструктор основного, и его теле вызываются базовый, а в его теле его базовый, а в самом корне объекта по цепочке
...
Рейтинг: 0 / 0
04.10.2013, 21:21
    #38417439
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
откройте исполняемый утилитой ildasm.exe
...
Рейтинг: 0 / 0
05.10.2013, 11:24
    #38417604
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
Где-то в степиоткройте исполняемый утилитой ildasm.exe извините, а деструктор для объекта базового класса может вызваться раньше? ведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса
...
Рейтинг: 0 / 0
05.10.2013, 12:58
    #38417636
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
авторведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса
Довольно смелое утверждение, а если базовый класс абстрактный, то будет храниться ссылка на объект абстрактного класса?
тынц
даже если виртуально предположить что так, никак нет, он не может потому что дерево вызовов финализатора( если они определены) начинается в финализаторе основного производного, а заканчивается в базовом, так вот в финализаторе базового и вызывается последний виртуальный финализатор
объекта - прародителя всех ссылочных типов..
...
Рейтинг: 0 / 0
05.10.2013, 13:06
    #38417641
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
mr.davidos,
Ушел пить до понедельника ))
...
Рейтинг: 0 / 0
05.10.2013, 15:59
    #38417724
mr.davidos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сборщик мусора
Где-то в степиmr.davidos,
Ушел пить до понедельника )) ахахахаха давай
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сборщик мусора / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]