zoukankan      html  css  js  c++  java
  • STL sort的危险之处

    STL好用是好用, 不慎的话相当危险, 尤其是俺们这些服务器程序. 
        迭代器失效就不说了, 发生了就是个当机回档的事, 慎之!


        最近工作中看到了stl::sort排序导致的一个core, 问题的根源就是, stl::sort要求被排序的对象必须是顺序确定的, 比如你在重载<操作符的时候

    class Test1 
    {
    int a;
    bool operator < (const Test1& rhs) {
    return this->a < rhs.a;
    }
    };

        上面的代码就是没问题的, 因为两个给定的Test1对象, 调用<的时候的结果是一致的.但是如果是下面这样

    class Test2 
    {
    int a, b;
    bool operator < (const Test1& rhs) {
    return this->a < rhs.a || this->b < rhs.b;
    }
    };

    那么, 对于obj1(a = 1, b = 4)和obj2(a = 2, b = 3)来说, obj1 < obj2的结果是真, 而obj2 < obj1的结果也是真, 这样, stl::sort就会出错。

    又或者是:

    class Test2 
    {
    int a, b;
    bool operator < (const Test1& rhs) {
    bool ret = this->a < rhs.a;
    return !ret;//降序排序
    }
    };

    当排序的序列中,如果有两个Test类的a一样大,就会出错。

        主要的原因是在stl::sort的内部, 由于这种无法判断两个元素大小的问题, 导致迭代器失效. 这次不是因为用户erase让其失效的, 而是因为没有遵守stl::sort的前置条件, 而导致的内部迭代器失效, 比平常发生的失效更加的隐藏. 
         可能看到这个错误会觉得怎么可能写出这种逻辑呢, 但是有时候在实现业务逻辑的时候, 就是很难发现这样的和程序内建必要条件相矛盾的地方, 从而产生错误.

    参考:http://shaohui.me/archives/140

  • 相关阅读:
    修改MySQL的数据目录
    Ubuntu安装Sublime Text3插件Emmet的依赖PyV8
    ThoughtWorks的面试总结
    使用百度地图做地理追踪
    Make a plan
    ubuntu 下php + nginx
    编译Nginx
    CSS清除浮动
    关于项目提测质量的一点思考
    Jenkins配置
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/2317112.html
Copyright © 2011-2022 走看看