迭代向量时的C ++分段错误

时间:2012-11-01 04:59:27

标签: c++ vector segmentation-fault fault

我有一个维护整数向量的程序。我有三个函数添加一个整数,删除一个整数并检查一个整数是否已经在向量中。问题出在最后一个问题上。

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 vs 4, 2 vs 4, 4 vs 4, 12 vs 4

我也尝试使用children [i]等循环,但无济于事。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

你的循环应该改变:

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

到此:

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

这不会解决问题,因为使用的容器是一个向量,并且为该容器类定义了向量的迭代器之间的差异。但是,优先选择仍然是一种好习惯,

ic != container.end()

因为这适用于缺乏该定义的容器。

答案 1 :(得分: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++;
   }        
}

为什么你得到段错误是任何人的猜测。一种可能性是removeChild()可以在其他一些线程中调用,使isChild()中的迭代器无效。这只有在没有正确静音的情况下使用线程时才有可能(在这种情况下你会遇到更大的问题:)