Кратко
- Деструктор: Специальная функция для освобождения ресурсов при уничтожении объекта.
- Синтаксис: Имя класса с ~, без параметров и возвращаемого значения.
- Применение: Освобождение памяти, закрытие файлов, освобождение других ресурсов.
- Особенности: Не могут быть перегружены, могут быть виртуальными в полиморфных классах.
Подробнее
Пример деструктора
#include <iostream>
 
class MyClass {
public:
    MyClass() {
        std::cout << "Constructor called" << std::endl;
    }
 
    ~MyClass() {
        std::cout << "Destructor called" << std::endl;
    }
};
 
int main() {
    MyClass obj; // Создание объекта, вызывает конструктор
    std::cout << "Object created" << std::endl;
    // Объект автоматически уничтожается в конце блока, вызывается деструктор
    return 0;
}Вывод программы:
Constructor called
Object created
Destructor called
Деструкторы и динамическое выделение памяти
Деструкторы особенно важны, если класс использует динамическое выделение памяти. В деструкторе необходимо освободить всю динамически выделенную память, чтобы избежать утечек памяти.
#include <iostream>
 
class MyClass {
private:
    int* data;
public:
    MyClass(int size) {
        data = new int[size]; // Выделение памяти
        std::cout << "Memory allocated" << std::endl;
    }
 
    ~MyClass() {
        delete[] data; // Освобождение памяти
        std::cout << "Memory deallocated" << std::endl;
    }
};
 
int main() {
    MyClass obj(10); // Создание объекта, вызывает конструктор
    std::cout << "Object created" << std::endl;
    // Объект автоматически уничтожается в конце блока, вызывается деструктор
    return 0;
}Вывод программы:
Memory allocated
Object created
Memory deallocated
Правила для деструкторов
- Не могут быть перегружены: У класса может быть только один деструктор.
- Виртуальные деструкторы: Если класс предполагает Наследование, и объекты могут быть уничтожены через указатель на базовый класс, деструктор должен быть виртуальным.
class Base {
public:
    virtual ~Base() {
        // Освобождение ресурсов базового класса
    }
};
 
class Derived : public Base {
public:
    ~Derived() {
        // Освобождение ресурсов производного класса
    }
};