Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Очистка памяти от объектов класса в динамической памяти

#cpp


Доброго времени суток ,
Возник такой вопрос. Допусти у меня есть объект класса. Который в свою очередь имеет
просто поля и методы. То есть можно бы было заменить структурой (даже и без методов).
Место для него я выделяю в динамической памяти подобно этому 
 someObj* objPointer = new someObj();

То есть этот класс выступает в роли просто контейнера данных и работы с ними.
Вопрос в том, как правильно очистить память от этого класса? Допустим если у меня
в есть поле класса указатель на другой класс , то естественно , я пропишу в деструкторе
удаление подуровней. 
А как быть с самим классом ? В деструкторе если не брать удаление подуровней, больше
писать то и нечего , так как поля класса , не указатели , а статические переменные .
Нужно ли его удалять созданный класс с помощью такой конструкции ? 
delete objPointer

И как правильно вообще работать с объектами классами в динамической памяти, со структурами
делал просто через делит , хотя у структуры есть тоже деструктор .
Спасибо заранее ?    


Ответы

Ответ 1



При вызове оператора delete для указателя на объект класса будет вызван его деструктор. В деструкторе вы должны освободить всю память, которую динамически выделили в конструкторе или других методах данного класса. Для тех полей класса, которые объявлены в статической памяти, будет вызван соответствующий деструктор автоматически. Если класс, к которому относится данный объект, является потомком другого класса, то потом будет вызван деструктор базового класса и его полей (не забывайте, что деструктор должен быть объявлен как виртуальный, иначе будет вызван деструктор только того класса, указателем на который вы пользуетесь. Могут быть утечки памяти и прочие Ужасные Вещи). И не забывайте, что разница между struct и class только в том, какие права доступа присваиваются полям данного типа по-умолчанию (public для struct и private для class). Больше никаких различий в типах объявления нет!

Ответ 2



Смотрите. Каждый объект является (точнее, может являться) ответственным за другие объекты. Часто ответственный объект содержит указатель на объекты, за которые он отвечает. В этом случае разумной политикой будет удалить эти объекты в своём деструкторе. Таким образом, когда внешний код удалит ответственный объект, при этом вызовется деструктор, и «внутренние» объекты тоже будут удалены. Более хорошая и современная идея такая: вместо обыкновенного указателя на объект хранить смарт-указатель. Тогда в деструкторе можно не заботиться о подчинённых объектах, они будут удалены автоматически. Если есть возможность автоматизировать часть логики программы, этим не стоит пренебрегать.

Ответ 3



Вы можете создавать и удалять экземпляр класса так, как написали. Тогда при его удалении c помощью delete работает деструктор класса, написанный Вами или созданный компилятором по умолчанию. Если Вы создали экземпляр в стеке: someObj obj , то этот же деструктор сработает при выходе из зоны видимиости или в конце программы.

Комментариев нет:

Отправить комментарий