Кратко
- Деструктор: Специальная функция для освобождения ресурсов при уничтожении объекта.
- Синтаксис: Имя класса с
~
, без параметров и возвращаемого значения. - Применение: Освобождение памяти, закрытие файлов, освобождение других ресурсов.
- Особенности: Не могут быть перегружены, могут быть виртуальными в полиморфных классах.
Подробнее
Пример деструктора
#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() {
// Освобождение ресурсов производного класса
}
};