“Збір сміття”. Деструктор

“Збір сміття”. Деструктор


Зміст


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()
    {
        // дії, які потрібно виконати, якщо буде відбуватись "збір сміття",
        // і може викликатись деструктор
        // ...
    }
}

 


Зв’язані теми