Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уничтожение объектов, почему так,а не иначе 
V
    Опции темы
jonie
Дата 19.8.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Ок. Удаление объектов в .NET....
Из С++ : удаление будет произведено сразу же после выхода объекта из области видимости путем вызова дестрокутора и освобждении памяти...
В .NET же удаление сразу нет (ну оно понятно почему)... при выходе из области видимости уменьшается количество ссылок на объект, потом (неизветно когда) пробегает 1-2 раза GC по памяти и чистит (попутно сжимая кучу) память..и вызывая деструкторы (финализаторы aS .NET like) и Dispose() (ежели IDisposable вообще реализуется)....я правильно понимаю картинку)?
ежели правильно то почему финализатор вызывается из GC, а не при достижении внутреннего счетчика ссылок нуля? Тогда необходимость в Dispose() вообще бы отпала (?). Необязательно сжимать кучу, достаточно вызова деструктора и помечании объекта как готового к уничтожению из памяти... почему сделано иначе ?!
Никак не могу найти разумного объяснения (.... в общем хочу узнать почему 8) не пинайте строго.. я сам "из мира другого" (c++)))

Это сообщение отредактировал(а) jonie - 19.8.2007, 21:08


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Void
Дата 19.8.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Цитата(jonie @  19.8.2007,  23:07 Найти цитируемый пост)
ежели правильно то почему финализатор вызывается из GC, а не при достижении внутреннего счетчика ссылок нуля? 

Потому что нет никакого счётчика ссылок.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
jonie
Дата 19.8.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



оО т.е. делается сложнее? вроде как список занятых адресов и "указатели" на них, ежели ничего не указывает то объект можно уничтожить... а нафига ?....че счетчик ссылок не впихнули тогда?) smile 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Linus
Дата 19.8.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 1
Всего: 4



GC проходит по куче, и освобождает память путём удаления объектов, на которые не имеется ссылок. После этого дефрагментирует кучу. Вопрос: зачем освобождать память и дефрагметировать кучу каждый раз после того, как объект "вышел из поля видимости" и на него не имеется указателей?
PM MAIL ICQ   Вверх
wotker
Дата 19.8.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 18.7.2006
Где: Ростов-на-Дону

Репутация: 1
Всего: 5



Цитата(jonie @ 19.8.2007,  21:56)
т.е. делается сложнее? 


Здесь подробный материал:
http://rsdn.ru/article/dotnet/GC.xml
--------------------
ICQ ::            347306684e-mail ::         wotker[at]rambler[dot]ru 
PM MAIL ICQ   Вверх
Void
Дата 19.8.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



jonie, не совсем. См. здесь. GC в .NET, как и любой другой GC, основан на понятии достижимости объекта.
Подсчёт ссылок, во-первых, пасует перед циклическими ссылками, во-вторых, медленнее, особенно в многопоточном окружении (каждое изменение счётчика требует блокировки!).

Это сообщение отредактировал(а) Void - 19.8.2007, 22:07


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
jonie
Дата 19.8.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата

После этого дефрагментирует кучу. Вопрос: зачем освобождать память и дефрагметировать кучу каждый раз после того, как объект "вышел из поля видимости" и на него не имеется указателей?
именно это я и говорил! я говорил что НЕТ необходимости дефрагментировать кучу каждый раз, а вот вызвать деструктор, почему бы и нет?. Равно как и освобождать память объекта.
Т.е. моя бы схема была такова : объект вышел за пределы видимости -> уменьшили внутеренее количичество ссылок на него -> если это количество нуль - то вызвать деструктор... когда-нить запустить обычную сборку мусора (ориентирование удалять\нет - по счетчику ссылок).... вот почему не так я до сих пор не понима  smile по мне так это напрашивается... но видимо в M$ увидели в таком подходе каой-то изъян.. вот и думаю какой)
------
Void Во.. терь увидел иъян ) хотя насчет производительности и удобства я бы поспорил... как гриться нада больше тестов 8) тему прикрываю.

Это сообщение отредактировал(а) jonie - 19.8.2007, 22:09


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Linus
Дата 19.8.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 1
Всего: 4



Цитата

именно это я и говорил! я говорил что НЕТ необходимости дефрагментировать кучу каждый раз, а вот вызвать деструктор, почему бы и нет?. Равно как и освобождать память объекта.

А вот создание новых объектов идёт с учётом того, что куча отдефрагментирована => нет смысла искать область памяти, которой будет достаточно для размещения нового экземпляра объекта. Есть обычный указатель на самый верхний объект в куче, его и используют для рассчёта адреса следующего нового объекта. А освобождать память каждый раз не вижу смысла, сборщик мусора за нами всё уберёт, как нужно будет smile
PM MAIL ICQ   Вверх
jonie
Дата 19.8.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Linux я хз как те еще сказать что я имею в виду)... я говорил лишь про вызов деструктора в стиле С++ , все остальное пусть так же и остается 8-)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Linus
Дата 19.8.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 1
Всего: 4



Цитата

Linus я хз как те еще сказать что я имею в виду)... я говорил лишь про вызов деструктора в стиле С++ , все остальное пусть так же и остается 8-)

В NET хорошим стилем считается вызов Dispose для освобождения ресурсов, занятых объектом. Работа деструкторов (финализаторов) не детерминированна, так как освобождение памяти происходит в 2 прохода GC. Определитесь с вопросом, чего требуется.

P.S. Здесь вместо вызова деструктора (как в С++) лучше вызвать Dispose(), и затем потерять ссылку на объект. GC потом подберёт.
PM MAIL ICQ   Вверх
altarvic
Дата 20.8.2007, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 2.3.2007

Репутация: 1
Всего: 1



Dispose применяют для немедленной чистки неуправляемых ресурсов (всякие хендлы и.т.п), а сам объект так же уничтожается GC. По части работы GC очень подробно описано на сайте MSDN или у Рихтера в книге.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0876 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.