Деструктор. «Сборка мусора»

Деструктор. «Сборка мусора»


Содержание


1. Что в языке C# означает «сборка мусора»?

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

В этом случае, важно освободить память что была выделена под объекты, которые уже не используются. Для этого система динамического распределения памяти C# использует так называемую «сборку мусора». Если происходит «сборка мусора» то освобождается память для объектов, которые не используются.

 

2. Каким образом система «сборки мусора» определяет: используется ли объект или нет?

Чтобы определить, используется объект или нет, система «сборки мусора» просматривает ссылки на этот объект на данный момент. Если ссылки отсутствуют, то этот объект считается ненужным и можно выполнять освобождение памяти для него. В дальнейшем эта освобожденная память может быть использована для распределения других объектов.

 

3. Как часто происходит «сборка мусора» в системе динамического управления памятью C#?

Если использованный объект становится ненужным, то выделенная для него память может быть освобождена не сразу, а позднее. В системе динамического управления памятью C# «сборка мусора» происходит только время от времени во время выполнения программы. «Сборка мусора» может не происходить если есть небольшое количество неиспользуемых объектов.

 



4. Для чего предназначены деструкторы?

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

Общая форма деструктора имеет вид:

~имя_класса()
{
   // код деструктора
}

где имя_класса – имя конкретного класса.

У деструктора отсутствует тип, который возвращается и список параметров.

 

5. Когда вызывается деструктор? Пример объявления деструктора в классе

В C# явно вызвать деструктор не получится, потому что на это нет специального оператора. Например, в языке C++ для этих целей используется оператор delete, который в языке C# не используется. Но в C++ не реализована система «сборки мусора».

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

Пример. В примере объявляется класс MyClass, в котором реализован деструктор ~MyClass().

// пример класса, в котором реализован деструктор
class MyClass
{
    int[] A; // внутренний массив A

    // конструктор класса
    public MyClass()
    {
        // выделение памяти для массива A
        A = new int[100];
    }

    // деструктор класса
    ~MyClass()
    {
        // действия, которые необходимо выполнить, если произойдет "сборка мусора",
        // и может быть вызван деструктор
        // ...
    }
}

 


Связанные темы