[英]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.