c++ - 在基于范围的 for 循环中获取无效引用

标签 c++ c++11 for-loop

<分区>

auto& kphist = this->kphist;
for (auto& it : kphist) {

    it.second.aging(); // EXC-BAD-ACCESS
    if(it.second.age > LAST_DAY){
        kphist.erase(it.first);
        continue;
    }

}

kphist 是私有(private)成员(member)

Class A{
private:
    unordered_map<int, KeyPointHistory> kphist;
} 

调试器显示 kphist 中的所有项目都是有效的,怎么可能在 for 循环中有错误的引用。什么可能会出错?

最佳答案

来自 cppreference.com for std::unordered_map::erase() : 对已删除元素的引用和迭代器无效。其他迭代器和引用不会失效。 因此,您不能在 for 循环范围内使用 std::unordered_map::erase()(因为这将尝试递增无效迭代器) .

为了避免递增一个无效的迭代器,你可以简单地先递增 然后使用原始迭代器删除:

for(auto i=map.begin(),end=map.end(); i!=end; ) { // no increment here
  auto it=i++;                                    // but here instead
  if(must_remove(it))
    map.erase(it);
}

事实上,由于 erase() 将迭代器返回到下一个元素,您可以避免额外的迭代器 it (感谢 Hurkyl 在评论中指出这一点):

for(auto i=map.begin(),end=map.end(); i!=end; ) { // no increment here
  if(must_remove(i))
    i = map.erase(i);                             // but here 
  else
    ++i;                                          //  or here instead
}

无需制作要删除的元素的键列表...

顺便说一句,你为什么不使用 std::map(而不是 std::unordered_map),因为你的键是 int(很容易订购)?另外,为什么要对同名成员变量进行引用kphist

关于c++ - 在基于范围的 for 循环中获取无效引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29571290/

相关文章:

c++ - C/C++ 有效指针,但获取 EXC_BAD_ACCESS 和 KERN_INVALID_ADDRESS

C++ - 读入以逗号分隔的文件行

java - i 和 i=i++ 在 for 循环 java 中

python - 在 Python 的 For 循环中迭代生成器

python - 列表的循环值

c++ - 将 cv::Mat 转换为 openni::VideoFrameRef

c++ - 在数字列表中搜索最小值和最大值

c++ - 前向声明未按预期工作

c++ - 通过模板检查 c++11 中是否存在函数(不是方法)

c++ - 解决代码中模块之间的相互依赖