2009-10-16 3 views
5

У меня есть двойной связанный список (очередь), который я сделал сам по себе.Очистка двойного списка

Мне интересно, чтобы очистить связанный список, достаточно ли просто удалить ссылки на голову и хвост?

например

public void Clear() 
{ 
    Head = null; 
    Tail = null; 
} 

Я визуализация эффекта домино, но я с трудом тестирования. Это приведет к тому, что весь объект окажется пустым по крайней мере. Все запросы данных (например, peek, dequeue и т. Д.) Возвращают null. Вы также можете легко перенести некоторые новые объекты. Чисто функциональный, похоже, работает.

Но я действительно хотел бы знать, правильно ли я делаю это.

ответ

7

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

Простейший способ тестирования состоит в том, чтобы добавить финализатор к объекту связанного списка, который выводит некоторые записи. Обратите внимание, что вы не можете быть уверены, когда запускает сборщик мусора (без принудительного его использования через GC.Collect()), поэтому вы не увидите завершающий финализатор, как только вы назовете метод Clear().

«Эффект домино» не произойдет; не имеет значения, если ссылки привязаны к объекту, а не ссылки могут быть прослежены до стека или статического объекта. Поэтому, если несколько объектов ссылаются друг на друга, но ничто не относится к ним, тогда все они будут собирать мусор одновременно.

+0

Спасибо, он хорошо объясняет ситуацию – CasperT

4

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

Поскольку на объект нет корня (нет прямых ссылок), сбор мусора может его забрать и удалить.

+0

Вопрос заключается в том, произойдет ли это в один проход GC, или каждый «строка» в эффект домино как OP описывает это взять один проход? –

+0

Спасибо за ответ. Это было заново. Я соглашусь с FacticiusVir , хотя он объяснил, что будет происходить более основательно :) – CasperT

+2

Это произойдет за один проход.Garbage Collection не удаляет только объекты, в которых нет ссылок на них, вместо этого они пытаются отследить ссылки на так называемые «корни», в основном такие вещи, как статические переменные, локальные переменные в методах непрерывной работы и т. Д. Если длинная цепочка объектов не имеет такой корневой ссылки, вся цепочка может быть собрана в одном и том же проходе. –

2

Я визуализация эффекта домино

Это не так, как GC работает.

GC сначала маркирует все «мертвые», затем, начиная с корневых объектов, он перемещается по всем объектам, на которые они ссылаются, отмечая каждый как «живой».

Поскольку ваш список больше не ссылается ни на какие корневые объекты (или на детей), он будет оставлен пометкой «мертвый».

Второй проход затем освобождает «мертвые» объекты.

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

Чуть более подробно здесь: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

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