удалить объект как из вектора, так и из памяти при итерации - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь удалить объект как из вектора объектов, так и из памяти, используя его деструктор. Я понял, что удаление объекта, на который указывает итератор, заставляет итератор указывать на элемент, следующий за последним удаленным элементом. Поэтому я попытался реализовать это:

std::vector<Customer*>::iterator j=customersList.begin();
while (j!=customersList.end()){
    customersList.erase(j);
    delete  *j;
}

это нормально? или что он перепрыгивает 2 места, применяя как стирание, так и удаление?

1 Ответ

0 голосов
/ 05 ноября 2018

Цикл не правильный, так как

  1. вы лишаете законной силы итератор j, а после этого отправляете вызов delete для недействительного итератора с разыменованными ссылками.

  2. Итератор j вообще не увеличивается в этом цикле.

Самый простой способ выдачи delete и стирания - это простой std::for_each, за которым следует vector::clear().

#include <algorithm>
//...
std::for_each(std::begin(customersList), std::end(customersList), [](Customer *c){delete c;});
customersList.clear();

или даже просто:

for (Customer* c : customersList )
    delete c;
customersList.clear();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...