Удаление объекта в C++ подразумевает удаление его членов?

Я новичок в C++, и у меня есть вопрос.

Если у меня есть класс, содержащий (указатель на) вектор:

class myClass {
public:
    int* direction;
    myClass(int d){direction=new int[d];}
}

Когда я создаю объект и удаляю его в основном:

int main(){
    int d;
    myClass* myvec;
    myvec = new myClass(d);
    delete myvec;
}

Также был последовательно вызван деструктор для направления myvec-> и освободилась память? Или мне нужно написать для этого подходящий метод?

Надеюсь, вопрос ясен ...

У вас нет класс, содержащий вектор. У вас есть класс, содержащий указатель. Используйте std::vector, тогда все будет хорошо. Или std::unique_ptr, если вам важны накладные расходы на векторную память.

Daniel Langr 26.11.2018 19:58

для int* vector ; вам понадобится деструктор. Найдите правило 3/5/0 и / или просто используйте std::vector.

drescherjm 26.11.2018 20:00

Удаление объекта подразумевает разрушение его членов. В случае необработанного указателя, который нет включает delete, на что он указывает (указатель vector - это уничтожен, но он отличается от вызова delete vector;). По возможности избегайте необработанных указателей (указателей на delete) в пользу интеллектуальных указателей (например, std::unique_ptr) или стандартных контейнеров (например, std::vector) в зависимости от случая.

François Andrieux 26.11.2018 20:00

Всем спасибо за комментарии! Таким образом, автоматическое освобождение будет выполняться путем замены «int * vector -> std :: vector vector». Я хорошо понял?

Thomas 26.11.2018 20:04

(кстати, я не понимаю, почему в моем вопросе "-x". Я прямо сказал, что я новичок, и, поскольку вы все ответили одно и то же, я думаю, вопрос был ясным ... бох ...)

Thomas 26.11.2018 20:07

Я не голосовал против. Помните, что цель вопроса - помочь будущим читателям решить ту же проблему. StackOverflow - это не форум. 3 человека проголосовали за то, чтобы сказать, что этот вопрос не является хорошим учебным пособием.

drescherjm 26.11.2018 20:08

@Thomas 1) Практическое правило: delete то, что вы new (в дополнение к delete[], что вы new[]), и избегайте использования new там, где в этом нет необходимости. 2) Если вы новичок, вам следует учиться на хорошая книга C++, а не путем случайного кодирования.

Algirdas Preidžius 26.11.2018 20:08

Это будет std::vector<int> vector;. Примечание: я бы рекомендовал не использовать vector в качестве имени вашего члена, так как это также имя стандартного типа. Это могло сделать код излишне запутанным для чтения, рассуждений и разговоров.

François Andrieux 26.11.2018 20:17

Спасибо за ваши комментарии. Я также попытался улучшить вопрос, следуя вашим предложениям.

Thomas 26.11.2018 20:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
9
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы выделили память с помощью new, вам также необходимо выделить ее для delete, например:

class myClass {
      int* direction;
public:
      myClass(int d) : direction(new int[d]) {}
      ~myClass() {
          delete[] direction;
      }
}

Но вам также необходимо написать конструктор копирования и оператор присваивания копии, а в C++ 11 и более поздних версиях также конструктор перемещения и оператор присваивания перемещения, чтобы это работало хорошо. В противном случае вы рискуете использовать версии по умолчанию для тех, кто копирует необработанный указатель, когда вы используете экземпляры этого класса.

Взгляните на Правило трех / пяти / нуля.

Было бы намного лучше использовать std::vector<int> вместо необработанного указателя.

Другие вопросы по теме