我很惊讶在地图中不存在的元素迭代时遇到EXC_BAD_ACCESS
异常。当我试图在迭代器上获得it->second
时,它不会倒下,实际上是map.end()
。它确实倒下了,试图达到一些不好的记忆。
我很想知道如何实现迭代器结束,以及如何摆脱这样的问题。总是只检查if (iterator == map.end ())
吗?
#include <iostream>
#include <map>
using namespace std;
int main(int argc, const char * argv[])
{
map<int, map<int, bool>> big_map;
map<int, bool> small_map;
small_map.insert(make_pair(1,1));
big_map.insert(make_pair(1, small_map));
auto non_exist = big_map.find(0);
for (auto i = non_exist->second.begin(); i != non_exist->second.end(); ++i) {
cout << i->second << endl;
}
return 0;
}
我的输出:
1
1
0
然后EXC_BAD_ACCESS
然后
答案 0 :(得分:2)
non_exist->second
时, non_exist == big_map.end()
是未定义的行为。你必须在开始循环之前检查一下。
答案 1 :(得分:1)
这还不够,您应该先检查non_exist != big_map.end()
。
auto non_exist = big_map.find(0);
if (non_exist != big_map.end())
{
for (auto i = non_exist->second.begin(); i != non_exist->second.end(); ++i) {
cout << i->second << endl;
}
}