std :: vector erase проблема с MSVC 2010 - PullRequest
0 голосов
/ 27 июня 2018

ALL,

У меня определен класс, который просто хранит данные (разные типы данных). У меня также есть std :: vector, который содержит указатели на объекты этого класса.

Примерно так:

class Foo
{
};

class Bar
{
private:
    std::vector<Foo *> m_fooVector;
};

В какой-то момент времени в моей программе я хочу удалить элемент из этого вектора. И поэтому я пишу следующее:

for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it <= m_fooVector.end(); )
{
    if( checking it condition is true )
    {
        delete (*it);
        (*it) = NULL;
        m_fooVector.erase( it );
    }
}

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

В другой функции я пытаюсь удалить простой вектор std :: wstring, и все работает нормально - строка удаляется, а размер вектора уменьшается.

В чем может быть проблема для такого поведения? Конечно, я мог бы попробовать проверить функцию стирания в стандартной библиотеке MSVC, но даже не знаю, с чего начать.

ТИА !!!

1 Ответ

0 голосов
/ 27 июня 2018

Ваш цикл неверен:

for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); )
{
    if (/*checking it condition is true*/)
    {
        delete *it;
        // *it = NULL; // Not needed
        it = m_fooVector.erase(it);
    } else {
        ++it;
    }
}

Традиционный способ - это erase-remove idiom , но, так как сначала вам нужно вызвать delete (умный указатель позволит избежать этой проблемы), вы можете использовать std::partition вместо std::remove:

auto it = std::partition(m_fooVector.begin(), m_fooVector.end(), ShouldBeKeptFunc);
for (std::vector<Foo *>::iterator it = m_fooVector.begin(); it != m_fooVector.end(); ++it) {
    delete *it;
}
m_fooVector.erase(it, m_fooVector.end());
...