если я использую динамически размещенный массив в классе, я должен освободить их в деконструкторе?
Если ваш класс выделяет память, то ваш класс должен освободить ее. Если класс динамического массива выделяет память, то этот класс динамического массива должен освободить память.
деконструктор, естественно, вызывает деконструкторы своих членов по умолчанию. освобождает ли это выполнение динамически выделенную память?
Давайте посмотрим, что говорит деструктор std::vector
:
Уничтожает контейнер. Вызывается деструктор элементов и освобождается использованное хранилище.
Оказывается, да, память действительно свободна. Это хороший дизайн для контейнера.
я должен вызвать деконструктор вектора члена в деконструкторе класса? (См. Args. ~ Vector (); // я должен сделать это? Это правильно?)
Нет, не стоит, это не правильно. Потому что - как вы сказали - "деконструктор называет деконструкторы своих членов по умолчанию" . Чтобы уточнить, члены всегда уничтожаются после того, как тело деструктора было выполнено. Если вы также вызовете деструктор члена внутри тела деструктора, то этот деструктор будет вызван дважды, что очень плохо.
Неявный деструктор корректен и достаточен для вашего класса. Вам не нужно определять это явно.
Вряд ли когда-либо понадобится явно вызывать деструктор. Деструкторы base-sub-объектов и членов вызываются автоматически при уничтожении суперобъекта. Деструкторы элементов массива вызываются автоматически при уничтожении массива. Деструкторы автоматических объектов вызываются автоматически , когда автоматический объект выходит из области видимости. Деструкторы динамических объектов вызываются автоматически по выражению delete
. Деструкторы статических объектов вызываются автоматически при статическом разрушении, которое происходит после возврата функции main
. Ни в одном из этих случаев нет необходимости явно вызывать деструктор.
Единственный случай, когда необходим явный вызов деструктора, - это ситуации, когда хранилище объектов повторно используется для других объектов - это сложный метод, который вам пока не нужно изучать.