Деструктор (програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Деструктор в об’єктно-орієнтованому програмуванні — спеціальний метод класу, який викликається автоматично при знищенні об'єкта і призначений для його деініціалізації (наприклад: звільнення ресурсів — пам'яті, закриття файлів тощо).

Виклик деструктора[ред. | ред. код]

Виклик деструктора для об'єкта здійснюється, коли при виконанні програми відбувається вихід за рамки області видимості цього об'єкта і його життєвий цикл завершується, або коли об'єкт пов'язаний з іншим об'єктом, який перестає існувати, або коли пам'ять під об'єкт динамічно виділяється вивільняється в явному вигляді, або прямим викликом деструктора для вивільнення ресурсів об'єкта без вивільнення пам'яті, в якій знаходиться об'єкт.

У мовах програмування, в яких існує механізм автоматичного прибирання сміття, складно детерміновано забезпечити можливість виклику деструктора, тому ці мови, як правило, вважаються не сумісними із програмною ідіомою RAII. В таких мовах, звільнення об'єкта і пов'язаних з ним ресурсів повинно виконуватись за допомогою явного виклику відповідної функції (які в коді зазвичай називаються Dispose()). Цей метод рекомендується для вивільнення ресурсів замість використання для цього фіналізатора.

Призначення деструктора[ред. | ред. код]

Призначення деструктора — вивільняти стан об'єкта шляхом вивільнення ресурсів, що використовувались об'єктом, як-то: вивільнення пам'яті, закриття файлів, закриття мережевих з'єднань, відправлення повідомлень іншим об'єктам тощо.

Синтаксис деструктора[ред. | ред. код]

  • C++ має правило іменування, за яким деструктори мають таке саме ім'я що і клас, в якому вони оголошені, але починаються з префіксу тильда (~). Деструктор в C++ не має типу та не має аргументів (окрім покажчика this, який передається неявно). Деструктори не успадковуються, але можуть бути віртуальними.
  • В Object Pascal, оголошення деструктора містить ключове слово "destructor" і може мати визначене користувачем ім’я (але зазвичай їх називають словом "Destroy").
  • В Perl, метод деструктор називається DESTROY.
  • В Об'єктній системі Moose для Perl, метод деструктор називається DEMOLISH.
  • В Objective-C, метод деструктор називається "dealloc".
  • В Swift, метод деструктор називається "deinit".
  • В PHP 5, метод деструктор називається "__destruct". В попередніх версіях PHP не існувало деструкторів.[1]
  • В Python декструктор описується в магічному методі __del__[2], але через наявність механізму збирання сміття, його виклик не може бути керований з програми.

C++[ред. | ред. код]

В C++ деструктор не може приймати аргументів. В прикладі деструктор вивільняє пам'ять, виділену конструктором.

Деструктор має те саме ім'я, що і клас, але зі знаком тильда (~), що вказаний перед ним. Якщо об'єкт був створений як автоматична змінна, його деструктор викликається автоматично, як тільки виконання програми виходить за межі області видимості. Якщо об'єкт було створено за допомогою виразу new, тоді деструктор буде викликано після явного виклику оператора delete із вказанням вказівника на об'єкт. Зазвичай, ця операція виконуються в рамках іншого деструктора, наприклад, в деструкторі об'єкту розумного вказівника.

В ієрархіях наслідування, декларація віртуального деструктора в базовому класі гарантує, що деструктори похідних класів будуть викликані належним чином саме для тих об'єктів, на які вказує покажчик (тип покажчика при цьому може відрізнятись від типу об'єкта, на який вказує покажчик, наприклад — коли об'єкт видаляється через вказівник на базовий тип класу). Об'єкти, які вивільняються таким чином повинні містити віртуальний деструктор.

Деструктор не повинен генерувати виключних ситуацій[3].

Приклад:

class Foo {
 public:
  // Типовий конструктор
   Foo(const char *name) { m_len = strlen(name); m_name = new char[m_len+1]; strcpy(name, m_name); m_name[m_len] = '\0'; }
  // Деструктор
   ~Foo() { delete [] m_name; }

  private:
    int m_len;
    char *m_name;
};

Посилання[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Constructors and Destructors [Архівовано 18 січня 2018 у Wayback Machine.], from PHP online documentation
  2. 3. Data model — Python 3.6.0a0 documentation. python.org. The Python Software Foundation. Архів оригіналу за 10 березня 2016. Процитовано 11 березня 2016. 
  3. GotW #47: Uncaught exceptions [Архівовано 29 листопада 2014 у Wayback Machine.] Accessed 31 July 2011

Див. також[ред. | ред. код]