簡體   English   中英

迭代向量時的C ++分段錯誤

[英]C++ Segmentation Fault when Iterating through a Vector

我有一個維護整數向量的程序。 我有三個函數添加一個整數,刪除一個整數並檢查一個整數是否已經在向量中。 問題出在最后一個問題上。

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]等循環,但無濟於事。 任何幫助,將不勝感激。 謝謝。

你的循環應該改變:

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

對此:

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

這不會解決問題,因為使用的容器是向量,並且為該容器類定義了向量的迭代器之間的差異。 但是,這仍然是一個好習慣,

ic != container.end()

因為這適用於缺乏該定義的容器。

正如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()迭代器無效。 只有在沒有適當的靜音時使用線程才能實現這一點(在這種情況下,你有一個更大的問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM