разница между деструктором и сборщиком мусора - PullRequest
8 голосов
/ 26 февраля 2012

Я хочу знать, есть ли какая-либо разница между деструктором и сборщиком мусора, деструктор используется для удаления всех неиспользуемых объектов в конце срока службы приложения, так же как и сборщик мусора, сборщик мусора может быть вручную Вызывается или выполняется в конце приложения, то же самое с деструктором, оба являются необязательными и используют для удаления объекта, на который нет ссылок, может кто-нибудь указать мне, в чем именно разница

Ответы [ 4 ]

7 голосов
/ 26 февраля 2012

Сборщик мусора и финализатор / деструктор неразрывно связаны, однако большинство объектов не нуждаются (и не имеют) деструктора. На самом деле они очень редки в управляемом коде и обычно используются для обеспечения освобождения неуправляемых ресурсов. Если у объекта есть деструктор / финализатор, сборщик мусора вызывает его примерно в то же время, что и сборщик (возможно, на следующем этапе). Сборка мусора недетерминирована - это происходит, когда это происходит, - часто это связано с давлением памяти.

Однако гораздо чаще встречается IDisposable. Это позволяет более предсказуемым образом высвобождать ресурсы сейчас (а не когда GC будет в следующий раз). Часто классы с финализатором также будут IDisposable, а реализация Dispose () отключит деструктор (он не нужен, если мы уже очистились). Обратите внимание, что Dispose () не связан с сборкой мусора, но имеет языковую поддержку с помощью оператора «using».

IDisposable намного чаще, чем финализаторы. Вы несете ответственность за обеспечение утилизации всего, что IDisposable. Дополнительное примечание: утилизация чего-либо не приводит к сбору объекта; это делается только GC по любому графику, который выберет GC. Утилизация, скорее, освобождение связанных ресурсов . Например, вы не хотите, чтобы файл был заблокирован открытым, пока не произойдет GC; метод Dispose () разблокирует файл (выпуская дескриптор файла ОС).

6 голосов
/ 26 февраля 2012

Деструктор - это специальная функция-член, которая вызывается при уничтожении объекта. Это последний метод, выполняемый классом.

Сборщик мусора является частью инфраструктуры, автоматически управляет памятью и недетерминированно собирает объекты без ссылок, чтобы избежать утечек памяти.

3 голосов
/ 26 февраля 2012

Сборщик мусора является частью среды .NET, которая отслеживает объекты и гарантирует, что объекты удаляются из памяти, когда они больше не нужны.

Деструктор является частью дизайна класса,Это противоположность конструктора.Когда вы объявляете это, GC вызывает его, когда уничтожает объект.

Вот документация MSDN.

0 голосов
/ 02 марта 2012

Сборщик мусора в основном работает, копируя все объекты, которые он может найти, в новую часть ОЗУ, а затем сбрасывая ядра в старой области; он не знает и не заботится, осталось ли пять или 500 000 объектов. Обратите внимание, что в дополнение к поиску всех объектов, на которые ссылаются живые сильные ссылки, сборщик мусора может также найти несколько других объектов, включая объекты, которые переопределяют Finalize, объекты, используемые в качестве блокировок монитора, объекты, на которые нацелены объекты WeakReference, и т. Д. Перед убрав старую область с орбиты, сборщик мусора должен иметь дело с любыми «специальными» объектами, о которых он знает, которые все еще могут там находиться.

Помимо прочего, сборщик мусора имеет список всех объектов, которые зарегистрировали финализатор; он проверит все объекты в этом списке, чтобы увидеть, были ли они скопированы в новую область памяти. Если найдены какие-либо объекты, которых не было, они будут удалены из списка объектов с зарегистрированным финализатором и добавлены в список объектов, чей метод Finalize должен быть запущен как можно скорее. Как только это будет сделано для всех объектов с зарегистрированным финализатором, любые объекты в списке объектов, нуждающихся в немедленной финализации, а также любой объект, на который эти объекты ссылаются, будут скопированы в новую область.

...