C ++打破了矢量循环

时间:2012-08-06 11:54:54

标签: c++ vector

我在类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();

的下一个循环中崩溃

我不知道为什么会崩溃?

3 个答案:

答案 0 :(得分:8)

替换

dl = Datalinks.end();

使用:

break;

退出循环

这是一个简单的例子来说明您的解决方案无法运作的原因:

int i = 0;
for (; i != 10; ++i)
{
    i = 10;
}

此循环永远不会结束,因为在比较i != 10

之前,我将增加到11

答案 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,可以使用它。