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

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

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

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

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

Призначення[ред.ред. код]

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

Деструктор не має типу.

Деструктори не успадковуються, але можуть бути віртуальними.

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

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

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

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

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

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

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

Приклад:

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, from PHP online documentation
  2. GotW #47: Uncaught exceptions Accessed 31 July 2011.

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