Деструктор C ++ — это функция-член, которая разрушает или удаляет объект. Функция деструктора вызывается автоматически, когда объект выходит за пределы области видимости: (1) функция завершается. (2) программа заканчивается. (3) заканчивается блок, содержащий локальные переменные. (4) Вызывается оператор удаления. Мы уже видели Конструктор на C ++ в этом блоге.
- Деструктор C ++
- # Программа для объявления деструкторов
- # Правила объявления деструктора
- # Требуется явное объявление деструктора
- # Порядок уничтожения
- # Виртуальные базовые классы
- # Невиртуальные базовые классы
- # Как деструкторы отличаются от обычных функций-членов.
- # Может ли у нас быть более одного деструктора в классе?
- # Когда нам нужно писать определяемый пользователем деструктор?
- # Может ли деструктор быть виртуальным?
- #Virtual Destructor
Деструктор C ++
Деструктор — это специальная функция-член, которая автоматически удаляет или разрушает объект (экземпляр класса), чтобы освободить память или закрыть файл, когда он выходит за пределы своей области видимости.
Деструктор вызывается, когда:
- Завершение программы: Когда объект объявляется с глобальной областью видимости или со статическим классом, деструктор выполняется автоматически, когда программа заканчивается на очистить память, занятую этим объектом.
- Поток управления из блока: в случае, когда объекты определены с локальной областью видимости в конкретном блоке деструктор вызывается, когда элемент управления выполнением выходит из этого конкретного блока, будь то функция, цикл или условие.
- Функция удаления: когда удаление функция выполняется/вызывается для определенного члена данных, тогда деструктор для этого объекта вызывается немедленно, даже если t память не освобождена. См. Следующий синтаксис. delete data_member;
- Явный вызов деструктора: Иногда необходимо явно вызвать деструктор, чтобы очистить ресурсы на абсолютные адреса, которые могут быть невозможны с оператором удаления, поскольку эта память никогда не выделялась из свободного пространства.
См. следующий синтаксис.
имя_объекта. имя_класса :: ~ имя_класса ();
# Программа для объявления деструкторов
См. следующую программу.
#include using namespace std; class apple {public: int roll; apple () {//Конструктор roll = 5; coutСм. следующий вывод.
![]()
# Правила объявления деструктора
- Он определяется с тем же именем, что и имя класса, которому предшествует оператор тильды (~).
- Он не содержит никаких аргументов или параметров.
- Он не возвращает никакого значения (даже void).
- В конкретном классе может быть только один деструктор.
# Требуется явное объявление деструктора
Хотя сам компилятор предоставляет деструктор по умолчанию, неплохо объявить деструктор самостоятельно, когда:
- Использование функций динамического распределения памяти в программе.
- Вы используете указатели/ссылки для доступа к элементам данных.
Если в вышеуказанных случаях используется деструктор по умолчанию, это может вызвать утечку памяти, при которой память объекта не может быть освобождена даже после завершения выполнения программы.
# Порядок уничтожения
# Виртуальные базовые классы
В в случае виртуальных базовых классов, т. е. классов, функции и переменные-члены которых могут быть переопределены и переопределены подклассами внешнего класса, деструктор выполняется в обратном порядке в графе наследования.
Следовательно, он начинается с нижнего класса last-child и идет вверх от крайнего левого угла вправо, следуя всем возможным путям. Итак, чтобы создать список классов, имеющих все уникальные элементы и содержащих их все.
См. Следующий синтаксис.
class a; class b; class c : virtual public a, virtual public b; class d: virtual public a, virtual public b; class e: public c, public d, virtual public b;Для указанного выше объявления список идет например,
Невиртуальный класс eНевиртуальный класс dНевиртуальный класс cVirtual class bVirtual class a# Невиртуальные базовые классы
С невиртуальными классами деструктор запускается в соответствии с порядком, в котором используются имена классов при объявлении дочернего класса. Это происходит в обратном порядке, то есть начиная справа налево в инструкции, объявляющей дочерний класс.
См. Следующий пример.
class child: public parent1, public parent2В этом случае сначала выполняется деструктор для класса parent2, а затем деструктор для parent1.
# Как деструкторы отличаются от обычных функций-членов.
- Деструкторы имеют то же имя, что и класс, которому предшествует тильда (~).
- Деструктор не принимает никаких аргументов и ничего не возвращает.
# Может ли у нас быть более одного деструктора в классе?
Нет, в классе может быть только один деструктор с именем класса, которому предшествует ~ (тильда), без параметров и без возвращаемого типа.
# Когда нам нужно писать определяемый пользователем деструктор?
Если мы не пишем наш деструктор в классе, компилятор создает деструктор по умолчанию для нас. Деструктор по умолчанию работает нормально, если мы динамически не выделяем память или указатель в классе.
Когда класс содержит указатель на память, выделенную в классе, мы должны написать деструктор для освобождения памяти до того, как экземпляр класса будет уничтожен. Это необходимо сделать, чтобы избежать утечки памяти.
# Может ли деструктор быть виртуальным?
Да, это всегда хорошая идея сделать деструкторы виртуальными в базовом классе, когда у нас есть виртуальная функция.
#Virtual Destructor
Удаление производного класса объект, использующий указатель на базовый класс, который имеет не виртуальный деструктор, приводит к неопределенному поведению. Если мы хотим исправить эту ситуацию, базовый класс должен быть определен с помощью виртуального деструктора.
Создание виртуального деструктора базового класса гарантирует, что объект производного класса уничтожен правильно, т. е. вызываются деструкторы базового и производного классов.
Итак, здесь мы заканчиваем статью о примере C ++ Destructor.