Библиотека книг по компьютерным технологиям
⇒ ⇒ Разработка Windows-приложений на Microsoft Visual Basic .NET и Microsoft Visual C# .NET. Учебный курс MCAD/MCSD
⇒ ⇒ ⇒ Глава 1. Введение в .NET Framework
⇒ ⇒ ⇒ ⇒ Занятие 6. Сбор мусора

Читать далее: Резюме

Циклические ссылки

Сборщик мусора успешно справляется с циклическими ссылками, которые раньше были одной из наиболее распространенных причин утечки памяти. Рассмотрим следующий пример:

Visual Basic .NET

Class Widget
  Public ChildWidget As Widget
  Public Parent As Widget
End Class

Class aClass
  Public GrandParent As Widget
  Sub Demo()
    Dim Parent As Widget
    Dim Child As Widget

    GrandParent = New Widget
    GrandParent.ChildWidget = New Widget

    Parent = GrandParent.ChildWidget
    Parent.ChildWidget = New Widget

    Child = Parent.ChildWidget
    Child.Parent = Parent

    GrandParent = Nothing
  End Sub
End Class

Visual C#

class Widget
{
  public Widget ChildWidget;
  public Widget Parent;
}

class aClass
{
  Widget GrandParent;
  void Demo()
  {
    Widget Parent;
    Widget Child;

    GrandParent = new Widget();
    GrandParent.ChildWidget = new Widget();

    Parent = GrandParent.ChildWidget;
    Parent.ChildWidget = new Widget();

    Child = Parent.ChildWidget;
    Child.Parent = Parent;

    GrandParent = null;
  }
}

Класс Widget состоит из полей ChildWidget и Parent, в которых хранятся ссылки на объекты Widget. В этом примере создается экземпляр класса Widget, и ссылка на него записывает в переменную GrandParent. Затем этот объект создает еще один экземпляр Widget и записывает ссылку на него в свое поле ChildWidget, а также в переменную Parent. Далее объект Parent создает третий объект типа Widget и записывает ссылку на него в свое поле ChildWidget и в переменную Child. Наконец, в поле Parent объекта Child помещается ссылка на объект Parent — в результате получается обратная ссылка от объекта Child на объект Parent. После сброса переменной GrandParent (путем записи в нее null), остается пара объектов, ссылающихся только друг на друга — налицо циклическая ссылка!

При разработке с использованием других платформ циклические ссылки вызывают утечки памяти, которые очень трудно обнаружить, однако сборщик мусора .NET Framework в состоянии отследить и устранить их. Так, если обнаружена пара объектов, ссылающихся только друг на друга, оба этих объекта помечаются как мусор.

Google
 
Рейтинг@Mail.ru
Сайт управляется системой uCoz