2015-01-09 2 views
-2

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

У меня есть класс, который представлен в виде дерева:

class MyNode 
{ 
    string Name; 
    List<MyNode> Descendants; 
    MyNode Parent; 
} 

Когда я создать узел, который имеет потомков, у меня есть ссылка на узел, а также сын имеет ссылку на узел в Материнская собственность. Кроме того, узел имеет ссылку на потомка в списке потомков.

Так что пример.

Node myNode = new Node(); 
Node myDescendant = new Node(); 
myNode.Descendants.Add(myDescendant); 
myDescendant.Parent = myNode; 

можно удалить ссылку на myNode настройку его null. Однако объект по-прежнему ссылается, потому что myDescendant ссылается на него в свойстве Parent. Объект myDescendant не вспоминается, поскольку он упоминается в списке потомков объекта-узла.

Похоже, что существует цикл, который избегает запоминания узла. Это правда? Возможно, мне нужно установить null все свойства в узле и потомках и очистить список потомков?

Большое спасибо.

+1

_ "У меня есть класс, который является ... struct" _ является противоречивым, а затем вы не учитываете 'class' | ключевое слово 'struct', которое могло бы прояснить его. Также вы смешиваете 'Node' и' MyNode'. –

+1

* У меня есть класс, который является структурой дерева: * Umm what? Шутки в сторону? Структуру или класс? –

+1

@HenkHolterman Если бы это была 'struct' в смысле C#, то он не мог установить его в' null'. Это, безусловно, «класс». Тип представляет древовидную структуру, используя более общее определение «структура», а не определение ключевого слова C#. I.e., это класс, который представляет структуру данных дерева. – Servy

ответ

1

Объекты собираются, когда нет ссылок , которые доступны из корневого местоположения. Корневые местоположения - это местоположения, которые «находятся в области видимости» на протяжении всего жизненного цикла приложения, такие как статические переменные, стек и т. Д.

Поскольку эти объекты имеют циклическую ссылку, если любой из них доступен через корневую ссылку (a локальная переменная, статическая переменная или все, что доступно через другую серию ссылок, ссылающихся на корневую ссылку), то ни один из них не имеет права на сбор мусора. Если ни один объект не доступен из корневой ссылки, то оба объекта имеют право на сбор мусора.

+0

Большое спасибо за ответ, а также, чтобы попытаться понять вопрос, который я задал, я плохо сказал в исходном посте. –

Смежные вопросы