Я новичок в 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-> и освободилась память? Или мне нужно написать для этого подходящий метод?
Надеюсь, вопрос ясен ...
для int* vector ; вам понадобится деструктор. Найдите правило 3/5/0 и / или просто используйте std::vector.
Удаление объекта подразумевает разрушение его членов. В случае необработанного указателя, который нет включает delete, на что он указывает (указатель vector - это уничтожен, но он отличается от вызова delete vector;). По возможности избегайте необработанных указателей (указателей на delete) в пользу интеллектуальных указателей (например, std::unique_ptr) или стандартных контейнеров (например, std::vector) в зависимости от случая.
Всем спасибо за комментарии! Таким образом, автоматическое освобождение будет выполняться путем замены «int * vector -> std :: vector vector». Я хорошо понял?
(кстати, я не понимаю, почему в моем вопросе "-x". Я прямо сказал, что я новичок, и, поскольку вы все ответили одно и то же, я думаю, вопрос был ясным ... бох ...)
Я не голосовал против. Помните, что цель вопроса - помочь будущим читателям решить ту же проблему. StackOverflow - это не форум. 3 человека проголосовали за то, чтобы сказать, что этот вопрос не является хорошим учебным пособием.
@Thomas 1) Практическое правило: delete то, что вы new (в дополнение к delete[], что вы new[]), и избегайте использования new там, где в этом нет необходимости. 2) Если вы новичок, вам следует учиться на хорошая книга C++, а не путем случайного кодирования.
Это будет std::vector<int> vector;. Примечание: я бы рекомендовал не использовать vector в качестве имени вашего члена, так как это также имя стандартного типа. Это могло сделать код излишне запутанным для чтения, рассуждений и разговоров.
Спасибо за ваши комментарии. Я также попытался улучшить вопрос, следуя вашим предложениям.





Если вы выделили память с помощью new, вам также необходимо выделить ее для delete, например:
class myClass {
int* direction;
public:
myClass(int d) : direction(new int[d]) {}
~myClass() {
delete[] direction;
}
}
Но вам также необходимо написать конструктор копирования и оператор присваивания копии, а в C++ 11 и более поздних версиях также конструктор перемещения и оператор присваивания перемещения, чтобы это работало хорошо. В противном случае вы рискуете использовать версии по умолчанию для тех, кто копирует необработанный указатель, когда вы используете экземпляры этого класса.
Взгляните на Правило трех / пяти / нуля.
Было бы намного лучше использовать std::vector<int> вместо необработанного указателя.
У вас нет класс, содержащий вектор. У вас есть класс, содержащий указатель. Используйте
std::vector, тогда все будет хорошо. Илиstd::unique_ptr, если вам важны накладные расходы на векторную память.