记一次由unordered_map引起的bug

1.编译环境

操作系统:ubuntu16.04

内核版本:Linux version 4.4.0-87-generic

gcc  版本:  5.4.0

2.由unordered_map引起的segment fault

上测试代码:

unordered_map<string,int> aa;
aa["a"] = 1;
aa["b"] = 2;
cout << aa.find("c")->second << endl;     //这句引起segment fault
cout << &(aa.find("c")->first) << endl;   //这句居然不报错  打印0x8
cout << &(aa.find("c")->second) << endl;  //这句也不报错    打印0x28
cout << &(aa.end()->second) << endl; //打印0x28 map<string, int> bb; bb["a"] = 1; bb["b"] = 100; cout << bb.find("ddddd")->second << endl; //打印 2 cout << bb.end()->second << endl; //打印 2

  

可以看出:

①unordered_map查找不存在的key时,正常会报段错误,但是加上去地址后便不报错了,而且地址为0x8和0x28两个地址。

这里就很奇怪,照理来说aa.find("c")返回的肯定是aa.end(),即end位置的迭代器,这个迭代器等价于nullptr,是不能访问其元素的,但是加上去地址后就不报错了。

②map最后一个迭代器也是可以访问的,而且始终是2。

关于上面两个bug在windows vs2012中并不存在,只要试图访问end迭代器的元素,就会报段错误。这两个bug应该是linux下STL的bug,具体原因不明。

在使用unordered_map和map时,最好先用find查询一下,因为假设key不存在的话,如果像上面那样需要取存储元素的地址,那么可能不会报段错误(楼主就遇到这个问题,调试了很久)

猜你喜欢

转载自www.cnblogs.com/deepllz/p/9186117.html