У меня есть свой класс, например:
class MyClass {
public:
int i;
std:string name;
void DoSomeStuff();
}
и другой класс со списком моих пользовательских классов:
class MyClassList {
public:
std::vector<MyClasss> myClassList;
}
Как должен быть деструктор списка, чтобы освободить все используемое векторное пространство в памяти:
MyClassList::~MyClassList
{
myClassList.clear();
delete &myClassList;
}
Это код правильный, избыточный или неправильный?
Спасибо за помощь…
Вам не нужно ничего делать, просто позвольте этому выпасть из области видимости. RAII будет гарантировать, что векторная память очищена, когда ваш экземпляр MyClassList
выходит за рамки.
Этот код является избыточным (и, как указал Кибер, даже неверный, потому что вы не можете delete
вектор).
Обратите внимание, что вы можете и должны delete
только вещи, выделенные с new
и это ровно один раз. То же относится и к new[]
а также delete[]
, Наличие члена, который должен быть удален, могло бы иметь смысл, если бы ваш собственный деструктор имел смысл, хотя обработка ресурсов оставлялась бы обработчикам ресурсов, таким как интеллектуальные указатели и std::vector
обычно путь.
Неявно сгенерированный деструктор уничтожит все члены и базы в обратном порядке построения, то есть он вызовет все их деструкторы в правильном порядке. Так деструктор std::vector
будет вызван и освободить все ресурсы, которыми он владеет.
Этот принцип применяется ко всем хорошо разработанным классам и известен как RAII.
Поскольку все создается в стеке, как только объект, созданный вами из класса List, покидает область видимости, его неявный деструктор вызовет для вас деструктор std :: vector. Если вы хотите убедиться, что можете иметь свой собственный деструктор и использовать переменные-члены vector’s.clear (), чтобы очистить его содержимое. Единственный раз, когда вам нужно удалить, это когда вы создаете новую память в куче! Однако я не буду использовать new и delete, если только вызовы new и delete не являются частными методами ваших классов и оба находятся в одном и том же методе, или если new находится в конструкторе, а delete — в деструкторе. Даже тогда все же лучше использовать shared_ptr<> и unique_ptr<> потому что если вы не используете их методы выпуска, их деструкторы будут делать это автоматически, когда объекты теряют область видимости, предотвращая утечки памяти
!