«вызов деструктора» и «освобождение памяти, связанной с переменной» - это совершенно разные вещи.
Деструктор - это просто функция, которую C ++ достаточно хорош для вызова, когда ваш объект выходит из области видимости или явно удаляется. Компилятор генерирует это для вас, как говорили другие. Это удобный способ очистить все в своем классе, что вам нужно.
Освобождение памяти, связанной с чем-либо в стеке, требует изучения работы стека. Когда вызывается функция, память выделяется для всего в стеке, просто помещая в стек количество данных, необходимых для этих переменных. Хотя это явно не указано в спецификации C ++, «push» на самом деле просто включает в себя указатель на вершину стека, указывающий выше (или ниже), чтобы освободить место для дополнительных переменных. Это простое добавление указателя. Когда функция возвращается, происходит вычитание указателя.
void foo()
{
HerClass y;
YourClass x; // stack incremented sizeof(YourClass) + sizeof(HerClass)
return; // destructor called,
// then stack decremented sizeof(YourClass) + sizeof(HerClass)
}
Все выскочило из стека. Вы можете узнать больше об этом, прочитав о соглашениях о вызовах .
Память кучи явно контролируется программой вручную. Если код не выполняет явное управление кучей для вас, вам необходимо убедиться, что вы удаляете все, что у вас есть.