Деструктор (програмування)Деструктор в об’єктно-орієнтованому програмуванні — спеціальний метод класу, який викликається автоматично при знищенні об'єкта і призначений для його деініціалізації (наприклад: звільнення ресурсів — пам'яті, закриття файлів тощо). Виклик деструктораВиклик деструктора для об'єкта здійснюється, коли при виконанні програми відбувається вихід за рамки області видимості цього об'єкта і його життєвий цикл завершується, або коли об'єкт пов'язаний з іншим об'єктом, який перестає існувати, або коли пам'ять під об'єкт динамічно виділяється вивільняється в явному вигляді, або прямим викликом деструктора для вивільнення ресурсів об'єкта без вивільнення пам'яті, в якій знаходиться об'єкт. У мовах програмування, в яких існує механізм автоматичного прибирання сміття, складно детерміновано забезпечити можливість виклику деструктора, тому ці мови, як правило, вважаються не сумісними із програмною ідіомою RAII. В таких мовах, звільнення об'єкта і пов'язаних з ним ресурсів повинно виконуватись за допомогою явного виклику відповідної функції (які в коді зазвичай називаються Призначення деструктораПризначення деструктора — вивільняти стан об'єкта шляхом вивільнення ресурсів, що використовувались об'єктом, як-то: вивільнення пам'яті, закриття файлів, закриття мережевих з'єднань, відправлення повідомлень іншим об'єктам тощо. Синтаксис деструктора
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;
};
Посилання
Примітки
Див. також
|
Portal di Ensiklopedia Dunia