c++ - 两个指针在同时更改 map 的同时遍历 map 的段错误

标签 c++

我是 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/

相关文章:

c++ - gcov/lcov : problems generating coverage for header files

c++ - 结构不命名 C++ 中的类型

c++ - 快速编译高效排序算法(用于JIT编译)

c++ - 常量 reference_wrapper

c# - 如何制作 Firefox 附加组件

c++ - 将连续的重复字符替换为单个出现的字符

c++ - 缩放旋转剪切反射算法

c++ - 当我使用模板将一个字符数组复制到另一个数组时出现问题

c++ - 使用 Cairo 和 Allegro 5

c++ - Intellisense 不适用于 Visual Studio 2017 中的 cmake 项目