Если вы не предоставите деструктор, компилятор предоставит его вам. Этот деструктор будет вызывать деструкторы любых переменных-членов и базовых классов.
Есть несколько случаев, когда вы должны написать деструктор, чтобы избежать утечек. В одном случае вы держите пустой указатель на что-то, выделенное с помощью new
, и ваш объект является лучшим кандидатом для «владения» этим указателем. В большинстве случаев, когда вы выделяете что-то с помощью new
, вы считаете себя владельцем указателя.
Другой случай, когда вы приобрели какой-то другой ресурс и хотите его выпустить. Например, если вы открываете файл или сокет, вам, вероятно, потребуется написать собственный деструктор, чтобы закрыть его.
Хотя я делаю для всех таких ресурсов то, что я делаю класс, который оборачивает ресурс и имеет деструктор, который закрывает его. Это локализует проблему, поэтому я должен помнить как можно меньше об управлении ресурсами для большей части моего кода. Это распространенная идиома в C ++ и называется RAII , что означает «Инициализация ресурсов - это инициализация».
Именно поэтому вы должны предпочесть make_unique
и make_shared
или что-то вроде vector
выделению памяти с помощью new
. Они дают вам объекты, которые обертывают ресурс памяти, и деструкторы автоматически освобождают его для вас.
Чтобы ответить на вопрос в вашем комментарии к моему ответу более подробно ...
Деструктор локальной переменной вызывается, как только элемент управления покидает блок, в котором он был объявлен. Для конкретного примера:
void foo () {
A b;
{
A c;
} // Destructor for c is called here
} // Destructor for b is called here.