|
Сборщик мусора
|
|||
---|---|---|---|
#18+
Добрый день ! ! ! если , допустим в C++, у меня есть производный класс. и есть объект этого класса. то конструкторы вызываются от базового к производному, тогда как деструкторы наоборот. Теперь в языке C# есть сборщик мусора, который освобождает память . Допустим наш объект производного класса стал не нужен и потом вызвался сборщик мусора, как он узнает, что ему надо с начало поработать с объектом производного класса? т е есть ли у него список созданных объектов или он в произвольном порядке их уничтожает? допустим если есть 2 объекта одного и того же класса. то какой первым он удалит, при усл что ссылок на обоих нет на момент его вызова? в обратном порядке их вызова конструкторов или произвольно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 15:01 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, не понятен вопрос автор допустим если есть 2 объекта одного и того же класса. то какой первым он удалит очевидно тот который первым встанет в очередь на удаление.. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 16:06 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
Где-то в степиmr.davidos, не понятен вопрос автор допустим если есть 2 объекта одного и того же класса. то какой первым он удалит очевидно тот который первым встанет в очередь на удаление.. перед удалением объекта вызовется его деструктор( если он написан). т е в C# вызов дестрктора будет произвольный? не в обратном порядке вызова конструктора( как в C++) ?? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 19:33 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, немножко терминов по другому, финализатор, это обычный метод который принято соглашение обозначать лямбдой,название по типу и меть приватный, от других методов его ничего не отличает, впрочем отличает, компилятор оборачивает его в try- cath ибо он должен всегда исполниться без исключения, сборщик выбирает объекты у которых он определен, и помещает их в отдельную очередь ну это не к вопросу. так вот если базовый и тип который наследует базовый имеют финализатор ( имеют методы с одинаковым названием), обращение к ним идет по старшинству, если на сях старшим считается базовый до в диезе наоборот, вроде так, сама реализация логики в этих финализаторах должна быть локальной к типу где она реализуется не более ( можем получить оживление объекта, или обращение к уже удаленному), в базовых типах, что бы не реализовывать огород, в патерне диспозе Dispose(bool disposing) - виртуальный т.е. можно перегрузить ,можно смастерить заглушку в базовом..OnDisposе(), но реализовывать финализатор в обеих типах грешно.. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 20:03 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, скажем так, очередность - абсолютно до фонаря, ибо правильно написанный ф. должен всегда исполниться ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 20:09 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, и еще дополню, реализовывать финализатор без IDisposable, имхо - кощунство.. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 20:13 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, пожалуй изменю свое мнение ( хороший вопрос) так как такое дело я никогда не делал. сделал тестовый пример, и получилось что компилятор в финализаторе наследуемого класса, зашил вызов финализатора базового класса, то есть очередность как я сказал, а причина - вызов в стеке ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 20:33 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
Где-то в степиmr.davidos, пожалуй изменю свое мнение ( хороший вопрос) так как такое дело я никогда не делал. сделал тестовый пример, и получилось что компилятор в финализаторе наследуемого класса, зашил вызов финализатора базового класса, то есть очередность как я сказал, а причина - вызов в стеке А Вам не кажется, что на самом деле, если происходит вызов конструктора базового класса в списке инциализации конструктора производного, класса, то уже создан подобъект базового класса, для инциализации тех полей, которые были получены в ходе наследования, а раз есть объект , то он должен иметь время жизни, а так как работа с этим подобъектом строится на основе ссылки ( она без имени), то и значит когда мы потеряем ссылку на объект производного класса, он станет просто кандидатом для удаления и так как он хранит еще и ссылку на подобъект своего базового класса, то на основе этого и происходит вызов финализатора объекта базового и ее удаление. Просто он когда удаляет объект, наверное просто ищет в полях этого объекта ссылки на другие объекты и их тоже удаляет. я правильно понимаю?? ушел читать Рихтера)))))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 20:57 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
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. */ ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 21:10 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, немного не понял, выделение памяти и инициализация происходит при new, а конструктор это простой метод где происходит пользовательская инициализация, когда он вызывается объект уже создан и то что сначала вызывается базовый, а потом производный, имхо иллюзия, вызов базового зашит в самом верху стека производного, и если произойдет исключение просто не сработает механизм передачи ссылки, а сам объект никуда не девается он просто кандидат на удаления.. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 21:15 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, автор/* Output (to VS Output Window): Third's destructor is called. Second's destructor is called. First's destructor is called. */ все верно, вызывается деструктор основного, и его теле вызываются базовый, а в его теле его базовый, а в самом корне объекта по цепочке ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 21:19 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
откройте исполняемый утилитой ildasm.exe ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2013, 21:21 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
Где-то в степиоткройте исполняемый утилитой ildasm.exe извините, а деструктор для объекта базового класса может вызваться раньше? ведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 11:24 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, авторведь по сути у нас ссылка на такой объект, который будет неявно хранится в поле у производного класса Довольно смелое утверждение, а если базовый класс абстрактный, то будет храниться ссылка на объект абстрактного класса? тынц даже если виртуально предположить что так, никак нет, он не может потому что дерево вызовов финализатора( если они определены) начинается в финализаторе основного производного, а заканчивается в базовом, так вот в финализаторе базового и вызывается последний виртуальный финализатор объекта - прародителя всех ссылочных типов.. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 12:58 |
|
Сборщик мусора
|
|||
---|---|---|---|
#18+
mr.davidos, Ушел пить до понедельника )) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2013, 13:06 |
|
|
start [/forum/topic.php?fid=20&fpage=144&tid=1403917]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 139ms |
0 / 0 |