Я думаю, что вопрос в обратном порядке. Не думайте о том, что уничтожение объекта не делает: думайте о том, что делает .
Если у класса есть только неявный деструктор, то при его уничтожении уничтожаются также все нестатические члены-данные, как и все подобъекты базового класса.
Вы можете немного поспорить, делается ли это «неявным деструктором» или нет - если вы пишете деструктор, такие вещи все же случаются. Это часть самого процесса уничтожения объекта, а не часть кода деструктора как такового.
Итак, если ваше «соединение с файлом» является членом класса FILE *, то деструктор по умолчанию не освобождает его, потому что FILE * - это вещь C, и у него нет деструктора. Уничтожение ФАЙЛА * ничего не делает. Если ваше «соединение с файлом» является std::ofstream
, то у него есть деструктор, и деструктор пытается сбросить и закрыть соединение.
У вектора есть деструктор, который высвобождает ресурсы вектора. Это означает, что в свою очередь элементы в векторе называются деструкторами.
Для каждой имеющейся у вас переменной-члена вы должны просмотреть соответствующую документацию, чтобы увидеть, как обрабатываются ресурсы для этого типа. Очевидно, с опытом вы начинаете запоминать ответы.
Если переменная-член является указателем, то неявный деструктор ничего с этим не делает. Так что, если он указывает на выделенную кучу память, и этот объект содержит единственный указатель на эту память, вам необходимо освободить его, чтобы избежать утечки памяти.
Если вы обнаружите, что пишете деструктор на C ++, который должен освободить более чем одну вещь, то вы, вероятно, плохо спроектировали класс. Почти наверняка в другом месте в классе есть ошибки безопасности исключений: возможно сделать код правильно, но если у вас достаточно опыта, чтобы понять его правильно, то у вас достаточно опыта, чтобы упростить свою собственную жизнь, проектируя его иначе; ). Решением является написание классов с единственной обязанностью - управлять одним ресурсом - и использовать их в качестве переменных-членов. Или, лучше, найти библиотечные классы, которые управляют ресурсом, который вы используете. shared_ptr
довольно гибкий.
"нужно уничтожить переменные без кучи"
В C ++ нет такой вещи, как переменные "heap" и "non-heap". Уничтожение указателя не освобождает указанную вещь, по той очевидной причине, что ничто в типе указателя не говорит вам, как была выделена вещь, на которую он указывает, или кто «владеет» ею.