1

整数ベクトルを維持するプログラムがあります。整数を追加し、整数を削除し、整数が既にベクトルにあるかどうかを確認する 3 つの関数があります。問題は最後のものです。

vector<int> children;
void CtpTestingApplication::addChild(int child)
{
    for (int i=0; i<children.size(); i++)
    {
    //already a child
    if (children[i]==child)
        return;
    }
    //child not yet recorded
   children.push_back(child);
   cout<<"added child "<<child;
}

void CtpTestingApplication::removeChild(int child)
{
   for (int i=0; i<children.size(); i++)
   {
    //already a child, remove it
    if (children[i]==child)
    {
        children.erase(children.begin()+i);
        cout<<"removed child "<<child;
    }
   } 
   //not recorded, no need to remove
}

bool CtpTestingApplication::isChild(int child)
{
   vector<int>::iterator ic;
   bool result = false;
   for (ic= children.begin(); ic < children.end(); ic++)
   {
     cout<<*ic<<" vs "<<child;
  //     if (child==*ic)
         result = true;
   }
   return result;
}

「if (child==*ic)」のコメントを外すと、ベクトルが空ではなく、予想される整数が含まれていることが出力に示されていても、常にセグメンテーション違反が発生します。

たとえば、if ステートメントにコメントを付けると、1 対 4、2 対 4、4 対 4、12 対 4 が表示されます。

children[i] などを使用してループも試みましたが、役に立ちませんでした。どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

2

ループは次から変更する必要があります。

   for (ic= children.begin(); ic < children.end(); ic++)

これに:

  for (ic= children.begin(); ic != children.end(); ic++)

使用されるコンテナはベクトルであり、ベクトルのイテレータ間の差を取ることがそのコンテナ クラスに対して定義されているため、これは問題を解決しません。ただし、優先することは依然として良い習慣です。

ic != container.end()

その定義がないコンテナでも機能するためです。

于 2012-11-01T05:11:06.013 に答える
1

John3136 が示したように、私が目にする唯一の潜在的な問題はremoveChild関数にあります。次のように書き直してみてください。

void CtpTestingApplication::removeChild(int child)
{
   int i=0; 
   while (i<children.size())
   {         
      if (children[i]==child) {
         children.erase(children.begin()+i);             
         continue;
      }
      i++;
   }        
}

segfault が発生する理由は誰でも推測できます。1 つの可能性として、removeChild()が他のスレッド内で呼び出され、 のイテレータが無効になる可能性がありますisChild()。これは、適切なミューテックスなしでスレッドを使用している場合にのみ可能です (その場合、はるかに大きな問題があります:)

于 2012-11-01T05:11:57.633 に答える