powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сборщик мусора
16 сообщений из 16, страница 1 из 1
Сборщик мусора
    #38416915
mr.davidos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день ! ! !

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

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


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

А Вам не кажется, что на самом деле, если происходит вызов конструктора базового класса в списке инциализации конструктора производного, класса, то уже создан подобъект базового класса, для инциализации тех полей, которые были получены в ходе наследования, а раз есть объект , то он должен иметь время жизни, а так как работа с этим подобъектом строится на основе ссылки ( она без имени), то и значит когда мы потеряем ссылку на объект производного класса, он станет просто кандидатом для удаления и так как он хранит еще и ссылку на подобъект своего базового класса, то на основе этого и происходит вызов финализатора объекта базового и ее удаление. Просто он когда удаляет объект, наверное просто ищет в полях этого объекта ссылки на другие объекты и их тоже удаляет. я правильно понимаю?? ушел читать Рихтера))))))))
...
Рейтинг: 0 / 0
Сборщик мусора
    #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
Сборщик мусора
    #38417436
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.davidos, немного не понял, выделение памяти и инициализация происходит при new, а конструктор это простой метод
где происходит пользовательская инициализация, когда он вызывается объект уже создан и то что сначала вызывается базовый, а потом производный, имхо иллюзия, вызов базового зашит в самом верху стека производного, и если произойдет исключение
просто не сработает механизм передачи ссылки, а сам объект никуда не девается он просто кандидат на удаления..
...
Рейтинг: 0 / 0
Сборщик мусора
    #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
Сборщик мусора
    #38417439
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откройте исполняемый утилитой ildasm.exe
...
Рейтинг: 0 / 0
Сборщик мусора
    #38417604
mr.davidos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиоткройте исполняемый утилитой ildasm.exe извините, а деструктор для объекта базового класса может вызваться раньше? ведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса
...
Рейтинг: 0 / 0
Сборщик мусора
    #38417636
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.davidos,
авторведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса
Довольно смелое утверждение, а если базовый класс абстрактный, то будет храниться ссылка на объект абстрактного класса?
тынц
даже если виртуально предположить что так, никак нет, он не может потому что дерево вызовов финализатора( если они определены) начинается в финализаторе основного производного, а заканчивается в базовом, так вот в финализаторе базового и вызывается последний виртуальный финализатор
объекта - прародителя всех ссылочных типов..
...
Рейтинг: 0 / 0
Сборщик мусора
    #38417641
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.davidos,
Ушел пить до понедельника ))
...
Рейтинг: 0 / 0
Сборщик мусора
    #38417724
mr.davidos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиmr.davidos,
Ушел пить до понедельника )) ахахахаха давай
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сборщик мусора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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