1.还在使用下面代码的小朋友就不应该了
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); iter++)
{
if(!iter->IsAlive())
{
entities.erase(iter);
}
}
(其中Entity是类名,entities是vector,iter是遍历的迭代器。)
<!> 删除是成功的,不过此时iter已经无效,变成了野指针! 再次直接使用必然会引发 违例访问的RE。
2.于是可以采用下面的方法
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); )
{
if(!iter->IsAlive())
{
iter = entities.erase(iter);
}else{
iter++;
}
}
或是直接自增
vector<Entity>::iterator iter;
for(iter = entities.begin(); iter != entities.end(); )
{
if(!iter->IsAlive())
{
entities.erase( iter++ );
}else{
iter++;
}
}
但是我这里的环境还是会崩溃 :(
后来没有办法,只能想出来这么一招:
for (i = 0; i < entities.size(); ++i)
{
if (!entities.at(i).IsAlive())
{
vector<Entity>::iterator iter;
iter = entities.begin();
int j = 0;
while (iter != entities.end() && j != i)
iter++,j++;
iter = entities.erase(iter);
}
}
正常运行!
感言:要是真的不熟悉——> 让 指针/迭代器 之类的东西少上镜, 崩溃率会大大下降。
|