我在类LinkRepository
中有一个方法,我正在检查向量数组Datalinks
中的重复条目,它是类的成员。我遍历数组中的所有元素以检入数组中已存在的新条目Datalink* datalink
。如果是,那么不要添加,只需退出循环。
void LinkRepository::SaveLink(Datalink* datalink) {
bool Exist = false;
for(vector<Datalink*>::iterator dl = Datalinks.begin(); dl != Datalinks.end(); ++dl)
{
if((strstr((*dl)->ParentID, datalink->ParentID) != NULL) && (strstr((*dl)->ChildID,datalink->ChildID) != NULL))
{
Exist = true;
dl = Datalinks.end();
}
}
if(!Exist)
{
Datalinks.push_back(datalink);
}
};
我的程序似乎在语句dl = Datalinks.end();
我不知道为什么会崩溃?
答案 0 :(得分:8)
替换
dl = Datalinks.end();
使用:
break;
退出循环
这是一个简单的例子来说明您的解决方案无法运作的原因:
int i = 0;
for (; i != 10; ++i)
{
i = 10;
}
此循环永远不会结束,因为在比较i != 10
答案 1 :(得分:4)
崩溃是因为首先将迭代器设置为Datalinks.end()
然后,在离开此迭代时,for
循环本身会使迭代器递增,从而导致无效操作。
答案 2 :(得分:0)
for(vector<Datalink*>::iterator dl = Datalinks.begin(); dl != Datalinks.end() && !Exist; ++dl)
{
if((strstr((*dl)->ParentID, datalink->ParentID) != NULL) && (strstr((*dl)->ChildID,datalink->ChildID) != NULL))
{
Exist = true;
}
}
就像每个人都说你正在迭代一个。因此,它会进入不需要的内存位置,最终导致seg故障。你必须意识到++ dl正在循环结束时发生。
此外,在这里使用break语句是荒谬的。你已经有了bool,可以使用它。