#cpp
Доброго времени суток , Возник такой вопрос. Допусти у меня есть объект класса. Который в свою очередь имеет просто поля и методы. То есть можно бы было заменить структурой (даже и без методов). Место для него я выделяю в динамической памяти подобно этому someObj* objPointer = new someObj(); То есть этот класс выступает в роли просто контейнера данных и работы с ними. Вопрос в том, как правильно очистить память от этого класса? Допустим если у меня в есть поле класса указатель на другой класс , то естественно , я пропишу в деструкторе удаление подуровней. А как быть с самим классом ? В деструкторе если не брать удаление подуровней, больше писать то и нечего , так как поля класса , не указатели , а статические переменные . Нужно ли его удалять созданный класс с помощью такой конструкции ? delete objPointer И как правильно вообще работать с объектами классами в динамической памяти, со структурами делал просто через делит , хотя у структуры есть тоже деструктор . Спасибо заранее ?
Ответы
Ответ 1
При вызове оператора delete для указателя на объект класса будет вызван его деструктор. В деструкторе вы должны освободить всю память, которую динамически выделили в конструкторе или других методах данного класса. Для тех полей класса, которые объявлены в статической памяти, будет вызван соответствующий деструктор автоматически. Если класс, к которому относится данный объект, является потомком другого класса, то потом будет вызван деструктор базового класса и его полей (не забывайте, что деструктор должен быть объявлен как виртуальный, иначе будет вызван деструктор только того класса, указателем на который вы пользуетесь. Могут быть утечки памяти и прочие Ужасные Вещи). И не забывайте, что разница между struct и class только в том, какие права доступа присваиваются полям данного типа по-умолчанию (public для struct и private для class). Больше никаких различий в типах объявления нет!Ответ 2
Смотрите. Каждый объект является (точнее, может являться) ответственным за другие объекты. Часто ответственный объект содержит указатель на объекты, за которые он отвечает. В этом случае разумной политикой будет удалить эти объекты в своём деструкторе. Таким образом, когда внешний код удалит ответственный объект, при этом вызовется деструктор, и «внутренние» объекты тоже будут удалены. Более хорошая и современная идея такая: вместо обыкновенного указателя на объект хранить смарт-указатель. Тогда в деструкторе можно не заботиться о подчинённых объектах, они будут удалены автоматически. Если есть возможность автоматизировать часть логики программы, этим не стоит пренебрегать.Ответ 3
Вы можете создавать и удалять экземпляр класса так, как написали. Тогда при его удалении c помощью delete работает деструктор класса, написанный Вами или созданный компилятором по умолчанию. Если Вы создали экземпляр в стеке: someObj obj , то этот же деструктор сработает при выходе из зоны видимиости или в конце программы.