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が11にインクリメントされるため、このループは終了しません。i != 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;
     }
}

みんなが言ったように、あなたは1回繰り返しています。そのため、不要なメモリ位置に移動し、最終的にセグメンテーション違反が発生します。++dlがループの最後で発生していることを理解する必要があります。

また、ここでbreakステートメントを使用するのはばかげています。あなたはすでにブール値を持っています、それを利用してください。

于 2012-08-06T13:57:05.417 に答える