Когда я устанавливаю переменную для нового объекта, старое значение умирает? - PullRequest
2 голосов
/ 10 февраля 2011

Предположим, у меня есть переменная, которая является List(Of T), с 100 элементами, которые являются экземплярами класса ....

Если я установлю эту переменную на новую List(Of T) с другими 100 экземплярамистарые полностью исчезают, верно?Они умирают.Абсолютно вещь прошлого, верно?

Ответы [ 5 ]

5 голосов
/ 10 февраля 2011

Если больше ничего не указывает на эти 100 вещей, тогда да, они имеют право на сборку мусора.

2 голосов
/ 10 февраля 2011

Если объекты в списке не ссылаются на что-либо еще, они будут выставлены на Сборка мусора

Сборщик мусора .NET Framework управляет распределением и выпуском память для вашего приложения. Каждый раз вы создаете новый объект, общий язык выполнения выделяет память для объект из управляемой кучи. Как пока адресное пространство доступно в управляемая куча, время выполнения продолжает выделять место для новых объекты. Тем не менее, память не бесконечна. В конце концов мусор Коллекционер должен выполнить сбор в Чтобы освободить память. Мусор оптимизирующий движок коллектора определяет лучшее время для выполнения сбор, основанный на распределении Быть сделанным. Когда мусор коллекционер выполняет коллекцию, это проверяет объекты в управляемой куче которые больше не используются приложение и выполняет необходимые операции по восстановлению их памяти.

1 голос
/ 10 февраля 2011

Как уже говорили другие, сбор мусора должен начаться. Однако, поскольку вы не можете контролировать, когда это происходит, возможно, данные все еще находятся в памяти.Наиболее решительные могут найти его.

Если вы абсолютно обеспокоены отслеживанием памяти, просто используйте цикл, чтобы установить для каждого элемента значение, подобное 0, или случайное значение.

1 голос
/ 10 февраля 2011

Да, вы объявляете новое место в памяти для переменной, старая ссылка теряется и очищается через некоторое время сборщиком мусора.

0 голосов
/ 10 февраля 2011

Не обязательно.CLR (которая является средой выполнения, в которой выполняется код C # и VB.net) является системой сбора мусора.Периодически среда выполнения будет проверять объекты в памяти, определять, какие из них недоступны из «корневого набора» (например, включая локальные переменные в стеке), и освобождать их.

В вашем примере, если нет других переменных или полей, содержащих ссылку на ваш список (которые также доступны из корневого набора), то исходный список будет освобожден.Кроме того, , если Список освобожден, и , если нет оставшихся экземпляров для каждого из элементов списка, то эти элементы также будут освобождены.Однако ссылка на один элемент списка не помешает освобождению самого списка или любого другого элемента списка.

...