C++ удаление объекта
Ли delete()
оператор уничтожить все подобъекты объекта тоже? Или мне нужно вызвать удаление подобъекта перед удалением родительского объекта?
class equipment
{
public:
int model_id;
...
}
class player
{
public:
int x, y;
equipment * Equipment;
player(void) { Equipment = new equipment[2];};
~player(void) { delete [] Equipment; }
};
int main (....)
{
player = new Player;
...
...
delete Player;
}
5 ответов
Вам нужно удалить динамически размещенные подобъекты в деструкторе основного объекта, и вы правильно сделали это, удалив массив Equipment
Оператор удаления удаляет все "подобъекты", как вы говорите, но обычно, и в вашем случае вам нужно удалить не только "подобъекты", но и память, на которую указывают указатели членов. Так, если вы используете векторный объект, например, он будет удален автоматически, но в этом случае вам нужно удалить его явно, что вы сделали правильно
Проще говоря, при разрушении объекта:
- Объекты-члены сами уничтожаются
- Объекты, на которые указывают указатели участников, не являются
Это означает, что вы должны удалить их вручную (как ваш Equipement
указатель), если вы им владеете. Возможен случай, когда ваш класс заканчивается указателем, который ему не принадлежит (например, дескриптор какого-либо другого объекта, который вам нужен в этом классе), и, следовательно, его не следует удалять.
Вы можете использовать умные указатели (то есть: std::shared_ptr
, std::unique_ptr
и т. д.) для более безопасного управления памятью (в частности, они автоматически удаляют указатели, которыми они управляют, следуя принципу RAII).
То, что вы делаете в своем примере, достаточно, вы
delete[] Equipment;
в деструкторе игрока, поэтому все содержащиеся в нем устройства будут удалены, как только игрок будет удален.
Красиво сделано!
Одна вещь, которую вам не хватает, это деструктор в оборудовании класса