为什么这个向量迭代器不可递增?

Roy*_*lov 19 c++ iterator memory-management vector

我正在尝试删除向量的内容而我收到错误 - 向量迭代器不可递增,为什么会这样?

这是我的析构函数:

City::~City()
{
    vector <Base*>::iterator deleteIterator;
    for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
        m_basesVector.erase(deleteIterator);
}  
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ste*_*sop 44

erase使迭代器无效.你不能再使用它了.幸运的是,它返回一个你可以使用的迭代器:

vector <Base*>::iterator deleteIterator = m_basesVector.begin();
while (deleteIterator != m_basesVector.end()) {
    deleteIterator = m_basesVector.erase(deleteIterator);
}
Run Code Online (Sandbox Code Playgroud)

要么:

m_basesVector.clear();
Run Code Online (Sandbox Code Playgroud)

你负责释放向量中指针引用的内存吗?如果这就是你正在迭代的原因(并且你的真实程序有更多你没有显示的代码,那就是释放循环中的那些对象),那么请记住,从向量的开头擦除是一个缓慢的操作,因为在每一步中,矢量的所有元素都必须向下移动一个位置.更好的是循环向量释放所有东西(然后clear()是向量,尽管迈克说如果向量是被破坏的对象的成员则没有必要).


riw*_*alk 11

问题是您在使用erase()函数时尝试使用迭代器.erase(),push_back(),insert()和其他修改函数使STL中的迭代器无效.

只需使用clear()函数:

City::~City()
{
    m_basesVector.clear();
}  
Run Code Online (Sandbox Code Playgroud)

  • @Matt:也不会`擦除()`. (3认同)