“Збір сміття”. Деструктор
Зміст
- 1. Що означає “збір сміття” в C#?
- 2. Яким чином система “збору сміття” визначає: використовується об’єкт чи ні?
- 3. Як часто відбувається “збір сміття” в системі динамічного керування пам’яттю C#?
- 4. Для чого призначені деструктори?
- 5. Коли викликається деструктор? Приклад оголошення деструктора в класі
- Зв’язані теми
Пошук на інших ресурсах:
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() { // дії, які потрібно виконати, якщо буде відбуватись "збір сміття", // і може викликатись деструктор // ... } }
⇑
Зв’язані теми
- Ініціалізація даних в класі. Конструктор класу. Конструктор за замовчуванням
- Динамічне виділення пам’яті. Оператор new. Виділення пам’яті для типів-значень, структур, перечислень, об’єктів класів. Виділення пам’яті для масивів