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)