память — C ++ Правильный способ освободить вектор пользовательского класса

У меня есть свой класс, например:

class MyClass {

public:
int i;
std:string name;

void DoSomeStuff();

}

и другой класс со списком моих пользовательских классов:

class MyClassList {

public:
std::vector<MyClasss> myClassList;
}

Как должен быть деструктор списка, чтобы освободить все используемое векторное пространство в памяти:

MyClassList::~MyClassList
{
myClassList.clear();
delete &myClassList;
}

Это код правильный, избыточный или неправильный?

Спасибо за помощь…

0

Решение

Вам не нужно ничего делать, просто позвольте этому выпасть из области видимости. RAII будет гарантировать, что векторная память очищена, когда ваш экземпляр MyClassList выходит за рамки.

5

Другие решения

Этот код является избыточным (и, как указал Кибер, даже неверный, потому что вы не можете delete вектор).

Обратите внимание, что вы можете и должны delete только вещи, выделенные с new и это ровно один раз. То же относится и к new[] а также delete[], Наличие члена, который должен быть удален, могло бы иметь смысл, если бы ваш собственный деструктор имел смысл, хотя обработка ресурсов оставлялась бы обработчикам ресурсов, таким как интеллектуальные указатели и std::vector обычно путь.

Неявно сгенерированный деструктор уничтожит все члены и базы в обратном порядке построения, то есть он вызовет все их деструкторы в правильном порядке. Так деструктор std::vector будет вызван и освободить все ресурсы, которыми он владеет.

Этот принцип применяется ко всем хорошо разработанным классам и известен как RAII.

2

Поскольку все создается в стеке, как только объект, созданный вами из класса List, покидает область видимости, его неявный деструктор вызовет для вас деструктор std :: vector. Если вы хотите убедиться, что можете иметь свой собственный деструктор и использовать переменные-члены vector’s.clear (), чтобы очистить его содержимое. Единственный раз, когда вам нужно удалить, это когда вы создаете новую память в куче! Однако я не буду использовать new и delete, если только вызовы new и delete не являются частными методами ваших классов и оба находятся в одном и том же методе, или если new находится в конструкторе, а delete — в деструкторе. Даже тогда все же лучше использовать shared_ptr<> и unique_ptr<> потому что если вы не используете их методы выпуска, их деструкторы будут делать это автоматически, когда объекты теряют область видимости, предотвращая утечки памяти
!

0
По вопросам рекламы [email protected]