Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Как правильно освободить память занятую элементами vector

Не могли бы пожалуйста подсказать, при добавление элемента в вектор я создаю его с помощью команды new
void Company::makeOrder(const char* name, const float price) { Order* new_order = new Order(name, price); orders_.push_back(new_order); }
И в конце программы я хочу чтобы деструктор класса, который хранит в себе vector удалил все его элементы, и если честно не получается, может кто подскажет?
class Order;
class Company { public: Company(std::string name); virtual ~Company() { auto new_it = orders_.end(); for(auto it = orders_.begin(); it != new_it; it++) { delete OrderVector[*it]; } }
void makeOrder(const char* name, const float price); void removeOrdersByProductName(const char* name);
void hire(const Employee& employee); void fire(const char* name); void renameEmployee(const char* old_name, const char* new_name);
friend std::ostream& operator<<(std::ostream& out, const Company& company);
private: std::string name_;
typedef std::list EmployeeList; EmployeeList employees_;
typedef std::vector OrderVector; OrderVector orders_; };
std::ostream& operator<<(std::ostream& out, const Company& company);


Ответ

Данное предложение
delete OrderVector[*it];
не имеет смысла. OrderVector - это имя типа. Поэтому применять к нему оператор индексирования бессмысленно.
Все можно сделать без всякого написания вручную цикла с помощью стандартного алгоритма std::for_each и стандартного функционального объекта std::default_delete
Вот демонстрационная программа.
#include #include #include #include
struct Order { ~Order() { std::cout << "Order::~Order()" << std::endl; } };
typedef std::vector OrderVector;
int main() { OrderVector orders = { new Order(), new Order(), new Order() };
std::for_each( orders.begin(), orders.end(), std::default_delete() );
return 0; }
Ее вывод на консоль
Order::~Order() Order::~Order() Order::~Order()
Если хотите использовать цикл вместо алгоритма, то достаточно написать
for ( auto order : orders ) delete order;
Например,
#include #include
struct Order { ~Order() { std::cout << "Order::~Order()" << std::endl; } };
typedef std::vector OrderVector;
int main() { OrderVector orders = { new Order(), new Order(), new Order() };
for ( auto order : orders ) delete order;
return 0; }
Результат будет такой же, что и для программы, показанной выше.
Что касается вашего собственного цикла, то правильно его будет записать следующим образом:
for ( auto it = orders_.begin(); it != orders_.end(); ++it ) { delete *it; }
Обратите внимание, что вместо данного объявления конструктора
Company(std::string name);
будет лучше записать
Company( const std::string &name );
Также в виду того, что вы используете вектор указателей, вам следует либо запретить копирование объектов класса, как, например, в определении класса записать
Company( const Company & ) = delete; Company & operator =( const Company & ) = delete;
Либо определить их явно.

Комментариев нет:

Отправить комментарий