В программировании часто используются так называемые конструкторы и деструкторы. Они обеспечивают инициализацию и очистку классов после применения. Значительно упрощают работу с программным кодом.

В этой статье мы рассмотрим деструкторы на примере C++. Разберемся, как вызвать деструктор и грамотно использовать его в имеющемся коде. Информация будет одинаково полезной как новичкам, так и опытным разработчикам.

Определение

Деструктор класса – это своеобразный вид функции-члена класса. Она выполняется при уничтожении объекта соответствующего класса. Представляют собой противоположность конструкторов:

  • конструктор отвечает за инициализацию класса;
  • destructor нужен для очистки.

Деструктор – это специальный метод класса, служащий специально для деинициализации объекта. Пример – освобождение памяти задействованного локального устройства.

Особенности работы

Когда объект будет выходить за пределы области видимости, или динамически выделенный объект явно удаляется при помощи ключевого слова delete, происходит автоматический вызов деструктора класса. Это происходит, когда таковой имеется изначально. Элемент вызывается для очистки, необходимой перед непосредственным удалением «лишнего» компонента в коде.

Вызывается деструктор для «сложных» классов. Для простых – тех, что отвечают за инициализацию обычных переменных-членов, он не нужен. Связано это с тем, что в C++ память при подобных обстоятельствах очищается самостоятельно.

Если объект класса содержит те или иные ресурсы (пример – дескрипторы файлов и баз данных, динамическую память), вызов рассматриваемого «инструмента» идеально подойдет разработчику. То же самое происходит, когда требуется провести какое-то действие до того, как имеющийся объект будет стерт.

Правила присвоения имени

Перед тем, как вызывать destructors, нужно сначала создать их. Для этого придется присвоить «инструменту» то или иное имя. Соответствующий процесс имеет несколько правил:

  • имя должно соответствовать классу, но с символом «тильда» в самом начале;
  • аргументов у изучаемого компонента программного кода нет и быть не может;
  • возвращаемый тип тоже отсутствует.

Эти принципы актуальны и для формирования конструкторов. Стоит обратить внимание на то, что во втором правиле подразумевается, что для каждого класса существует всего один единственный деструктор. Связано это с невозможностью их перегрузки в C++.

Если рассматриваемый «инструмент» нужно вызвать, делать это явным методом не придется. Это связано с тем, что объект на практике изредка требуется очищать более одного раза. Но именно эти элементы позволяют безопасно вызывать иные функции-члены в программном коде. Объект не будет удален до непосредственного выполнения destructor.

Пример

#include <iostream>
#include <cassert>
#include <cstddef>
 
class IntArray
{
private:
	int *m_array{};
	int m_length{};
 
public:
	IntArray(int length) // конструктор
	{
		assert(length > 0);
 
		m_array = new int[static_cast<std::size_t>(length)]{};
		m_length = length;
	}
 
	~IntArray() // деструктор
	{
		// удаляем динамически выделенный ранее массив
		delete[] m_array;
	}
 
	void setValue(int index, int value) { m_array[index] = value; }
	int getValue(int index) { return m_array[index]; }
 
	int getLength() { return m_length; }
};
 
int main()
{
	IntArray ar(10); // выделяем 10 чисел int
	for (int count{ 0 }; count < ar.getLength(); ++count)
		ar.setValue(count, count+1);
 
	std::cout << "The value of element 5 is: " << ar.getValue(5) << '\n';
 
	return 0;
} // ar здесь уничтожается, поэтому здесь вызывается функция деструктора ~IntArray()

Выше – наглядный пример кода, который лучше объясняет принцип работы деструкторов. Здесь приведен элементарный класс, использующий соответствующий «инструмент».

При компиляции приложение выдаст ошибку. В этом случае необходимо:

  • удалить флаг –Weffc++ из настроек компиляции;
  • добавить в класс такую запись:Деструкторы – что нужно знать программисту .

Выбрать нужно только один из предложенных вариантов. Можно опробовать каждый из них и решить, какая концепция программисту подходит больше.

Время выполнения

На примере, приведенном выше, можно понять, как вызвать деструктор. Чтобы удостовериться в том, что этот «инструмент» будет работать при уничтожении объекта, рекомендуется воспользоваться инструкцией count.

Деструкторы – что нужно знать программисту

Она задействована и в constructor, и в destructor. В приведенном примере Simple1 будет уничтожен после Simple2. Связано это с тем, что произошло удаление pSimple до непосредственного завершения функции. А simple не стирается до конца main(). Глобальные переменные создаются перед этим элементом, а удаляются после него.

RAII – что это такое

Рассматривая деструкторы, нужно обратить внимание на RAII в C++. Это – метод в программировании, в котором использование ресурсов привязано к времени жизни объектов с автоматической продолжительностью. В СИ-семействе он реализован через классы с constructors и destructors.

Тут стоит запомнить следующее:

  1. Ресурс приобретается в конструкторе. Используется на протяжении всей жизни объекта.
  2. Освобождение ресурсов проводится в деструкторах. Реализация – при уничтожении объекта.
  3. Ключевое преимущество метода заключается в том, что он способствует предотвращению утечки ресурсов. Поддерживает автоочистку.

IntArray в рассмотренном ранее примере – это наглядное пособие по применению RAII. Его принципам следуют также std::string и std::vector. 

Стоит обратить внимание на еще одну особенность рассматриваемого «инструмента». Если хочется воспользоваться функцией exit() в программном коде, приложение будет завершено. Деструкторы в данной ситуации не вызываются. Из-за этого рекомендуется пользоваться соответствующей командой крайне осторожно.

Как научиться основам C++

Чтобы научиться писать на C++ и пользоваться всеми возможностями этого языка, можно найти специализированную литературу, а также посмотреть видео-уроки. Но лучшее решение – это дистанционные компьютерные онлайн курсы.

На них пользователь в сжатые сроки сможет обучиться с нуля программированию не только на C++, но и на других языках. Процесс организован через интернет, лекции разрешено просматривать тогда, когда удобно. Гарантировано постоянное кураторство, помощь в формировании портфолио, а также интересные домашние задания и богатая практика. В конце курса выдается электронный сертификат. С его помощью можно подтвердить полученные навыки.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus! Ниже – один из них:

Деструкторы – что нужно знать программисту