1

我在一个类中有一个方法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();

我不知道它为什么会崩溃?

4

3 回答 3

8

代替

dl = Datalinks.end();

和:

break;

退出循环

下面是一个简单的例子来说明为什么你的解决方案不能工作:

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

这个循环永远不会结束,因为在比较之前 i 将递增到 11i != 10

于 2012-08-06T11:56:00.517 回答
4

它崩溃了,因为首先您将迭代器设置为Datalinks.end(),然后在离开此迭代时,for循环本身会增加迭代器,从而进行无效操作。

于 2012-08-06T11:57:16.943 回答
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;
     }
}

就像每个人都说你正在迭代一个。因此,它会进入不需要的内存位置,最终导致段错误。您必须意识到 ++dl 发生在循环结束时。

此外,在这里使用 break 语句是荒谬的。你已经有一个布尔值,利用它。

于 2012-08-06T13:57:05.417 回答