Кратко

  • Деструктор: Специальная функция для освобождения ресурсов при уничтожении объекта.
  • Синтаксис: Имя класса с ~, без параметров и возвращаемого значения.
  • Применение: Освобождение памяти, закрытие файлов, освобождение других ресурсов.
  • Особенности: Не могут быть перегружены, могут быть виртуальными в полиморфных классах.

Подробнее

Пример деструктора

#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

Правила для деструкторов

  1. Не могут быть перегружены: У класса может быть только один деструктор.
  2. Виртуальные деструкторы: Если класс предполагает Наследование, и объекты могут быть уничтожены через указатель на базовый класс, деструктор должен быть виртуальным.
class Base {
public:
    virtual ~Base() {
        // Освобождение ресурсов базового класса
    }
};
 
class Derived : public Base {
public:
    ~Derived() {
        // Освобождение ресурсов производного класса
    }
};