2012-11-01 64 views
1

我有一个程序维护一个整数向量。我有三个函数添加一个整数,删除一个整数,并检查一个整数是否已经在向量中。问题在于最后一个。迭代通过矢量时出现C++分段错误

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; 
} 

我总是得到段错误当我去掉“如果(孩子== * IC)”,即使打印输出显示,向量不为空,并且包含预期的整数。

例如,与if语句评论的,我可以看到 1比4, 2比4, 4对4, 12对4

我还试图利用儿童[i]和如此循环上,但无济于事。任何帮助,将不胜感激。谢谢。

+1

你能否提供一个表现这种行为的最小化_compilable_示例程序?给定的代码中没有任何内容会导致分段错误。 – Mankarse

+2

你的removeChild()方法有“问题” - 一旦你做了删除操作,它会“左移”所有成员以“填补空白”,所以你不会真正检查下一个成员。这只是一个问题,如果你可以有重复。如果你不能,那么为什么不在你找到一场比赛后打破循环? – John3136

+0

对不起,我希望我能。这是我正在慢慢编辑的一个巨大(工作)程序的一部分。我尽可能简化了这个问题,整个程序有十几个单独的文件,这些文件紧密结合在一起。 – user1790374

回答

2

你的循环应该从这个改变:

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

这样:

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

,因为使用的容器是一个载体,以载体的迭代器之间的差异这不会解决问题是为该容器类定义的。但是,更好的做法是更好地选择:

ic != container.end() 

因为这对于缺少该定义的容器有效。

+0

你好,我试过了,但还是不行。尽管如此,谢谢你。 – user1790374

+0

@ user1790374这是正确的答案。如果问题仍然存在,那么您正在做其他未包含在粘贴源中的错误。 – nurettin

+0

sashang和@pwned:谨慎解释为什么将'<'改成'!='会解决问题? –

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是任何人的猜测。一种可能性是removeChild()可以在其他某个线程中调用,使您的迭代器在isChild()中无效。这只有在你使用没有适当的互斥的线程时才可能发生(在这种情况下,你有更大的问题:)

+0

问题出在isChild() –

+0

everyone。非常感谢您的帮助和建议(特别是在如此深的时间)。 我用集合取代了矢量,并最终解决了这个问题。我意识到这不是最好的解决方案,但它必须这样做。 – user1790374

+0

@Aniket:只是因为你看到isChild函数中的段错误并不意味着问题出在那里。其他填充容器的函数,比如错误的removeChild函数,可能会设置isChild函数失败。 – sashang