我是 cpp 的新手,有一段代码要运行:
void particleFilter::mergeFilters(double mergeBound){
for(map<int, filter>::iterator fi = filters.begin(); fi != filters.end();){
for(map<int, filter>::iterator ji = filters.begin(); ji != filters.end(); ){
Rect recI = (fi -> second).getRecFilter();
Rect recJ = (ji -> second).getRecFilter();
double dis = (double)sqrt((double)(recI.x-recJ.x)*(recI.x-recJ.x)+(double)(recI.y-recJ.y)*(recI.y-recJ.y));
if(dis<mergeBound && dis>1){
double wi = (fi -> second).pi;
double wj = (ji -> second).pi;
cout <<"call remove function" << endl;
if(wi<wj){
cout << "remove id is " << (fi->second).objectID << endl;
removeFilter((fi->second).objectID);
fi++;
}
else{
cout << "remove id is " << (ji->second).objectID << endl;
removeFilter((ji->second).objectID);
ji++;
}
}
else{
++ji;
}
}
++fi;
}
}
它只有两个指针来比较映射中的每两个条目,但与此同时,它删除了映射中的一些条目。 removeFilter((fi->second).objectID);
函数肯定没有问题。
有人知道为什么会出现段错误吗?
最佳答案
您需要更改此代码:
removeFilter((fi->second).objectID);
fi++;
类似于:
auto tmpIt = fi;
fi++;
removeFilter((tmpIt->second).objectID);
并且对等效的 ji
代码也进行类似的更改。
这是因为被删除的迭代器是无效的,即使容器中没有其他迭代器也是如此。因此,您正在修改一个无效的迭代器,这是未定义的行为。制作拷贝并首先递增它可以解决问题。
关于c++ - 两个指针在同时更改 map 的同时遍历 map 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38608217/