zoukankan      html  css  js  c++  java
  • 记一次由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不存在的话,如果像上面那样需要取存储元素的地址,那么可能会报段错误

  • 相关阅读:
    机器学习
    区块链
    MongoDB 生态 – 可视化管理工具
    分库分表适用场景
    权限管理
    ASP .NET Core 2.1 HTTP Error 502.5 – Process Failure
    Core2.0 项目到2.1
    Anaconda 安装和使用Numpy、Scipy、pandas、Scikit-learn
    NET Core 2.1.0 now available
    SQL Server发布订阅功能研究
  • 原文地址:https://www.cnblogs.com/deepllz/p/9186117.html
Copyright © 2011-2022 走看看