1. #include <stdio.h>
    2. #include <vector>
    3. #include <algorithm>
    4. #include <new>
    5. struct foo_t
    6. {
    7. int size;
    8. };
    9. class cmp_t
    10. {
    11. public:
    12. bool operator()(foo_t *a, foo_t *b)
    13. {
    14. return a->size >= b->size;
    15. }
    16. };
    17. int main(int argc, char *argv[])
    18. {
    19. std::vector<foo_t *> vec;
    20. for (int i = 0; i < 17; i++)
    21. {
    22. foo_t *x = new(std::nothrow) foo_t();
    23. if (NULL == x)
    24. {
    25. goto fail;
    26. }
    27. else
    28. {
    29. x->size = 1;
    30. }
    31. vec.push_back(x);
    32. }
    33. std::sort(vec.begin(), vec.end(), cmp_t());
    34. fail:
    35. for(std::vector<foo_t *>::iterator iter = vec.begin(); vec.end() != iter; ++iter)
    36. {
    37. delete *iter;
    38. *iter = NULL;
    39. }
    40. return 0;
    41. }
    42. 然后编译
      1. g++ main.cpp -Werror -Wall -g

      然后执行,此时系统出core,错误类型为段错误
      如果无core文件产生,可以使用

      1. ulimit -c unlimited

      后重新执行一次,此时就会有core文件生成
      然后

      1. gdb a.out core
      2. (gdb) bt
      3. #0  0x0804889e in cmp_t::operator() (this=0xbfed92d0, a=0x0, b=0x9a9d0c8) at main.cpp:16
        #1 
        0x080497ff in
        std::__unguarded_partition<__gnu_cxx::__normal_iterator<foo_t**,
        std::vector<foo_t*, std::allocator<foo_t*> > >, foo_t*,
        cmp_t> (__first=..., __last=..., __pivot=@0x9a9d1a0, __comp=...) at
        /usr/include/c++/4.6/bits/stl_algo.h:2233
        #2  0x0804926a in
        std::__unguarded_partition_pivot<__gnu_cxx::__normal_iterator<foo_t**,
        std::vector<foo_t*, std::allocator<foo_t*> > >,
        cmp_t> (__first=..., __last=..., __comp=...) at
        /usr/include/c++/4.6/bits/stl_algo.h:2265
        #3  0x08048e84 in
        std::__introsort_loop<__gnu_cxx::__normal_iterator<foo_t**,
        std::vector<foo_t*, std::allocator<foo_t*> > >, int,
        cmp_t> (
            __first=..., __last=..., __depth_limit=7, __comp=...) at /usr/include/c++/4.6/bits/stl_algo.h:2306
        #4 
        0x08048a22 in std::sort<__gnu_cxx::__normal_iterator<foo_t**,
        std::vector<foo_t*, std::allocator<foo_t*> > >, cmp_t>
        (__first=...,
            __last=..., __comp=...) at /usr/include/c++/4.6/bits/stl_algo.h:5368
        #5  0x080487ce in main (argc=1, argv=0xbfed9464) at main.cpp:38

      可以看到,系统core在了排序函数里面。
      然后通过分析stl代码发现以下一段代码

      1. /// This is a helper function...
      2. template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
      3. _RandomAccessIterator
      4. __unguarded_partition(_RandomAccessIterator __first,
      5. _RandomAccessIterator __last,
      6. const _Tp& __pivot, _Compare __comp)
      7. {
      8. while (true)
      9. {
      10. while (__comp(*__first, __pivot))
      11. ++__first;
      12. --__last;
      13. while (__comp(__pivot, *__last))
      14. --__last;
      15. if (!(__first < __last))
      16. return __first;
      17. std::iter_swap(__first, __last);
      18. ++__first;
      19. }
      20. }

      此函数完成快速排序中分区功能,即将比哨兵小的数据放在其前,大的放在其后。
      函数中使用的是
      while (__comp(*__first, __pivot))
          ++__first;

      如果当比较元素相同返回真时,此时比较元素将会继续向下遍历,在极端情况下,例如程序中所有元素都是一样的情况下,在这种情况下,就会出现访问越界,结果就是导致程序出现segment fault

      所以在写c++ stl中的比较函数是,bool返回真的时候,一定是“真的”大,或者小,等于的时候只能返回false。

std::sort引发的core的更多相关文章

  1. std::sort运行出core(segment fault)

    http://note.youdao.com/noteshare?id=6aae09345e85ab55fe24ac959118a747

  2. 今天遇到的一个诡异的core和解决 std::sort

    其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...

  3. 将三维空间的点按照座标排序(兼谈为std::sort写compare function的注意事项)

    最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大, ...

  4. 源码阅读笔记 - 1 MSVC2015中的std::sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

  5. c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法

    在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误. 这是为什么呢?原因在于什么?如何解决? 看下面一个例子: int main(int, char*[]) { st ...

  6. 一个std::sort 自定义比较排序函数 crash的分析过程

    两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case. 注意:以下的分析都基于GCC4.4.6 一.解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的st ...

  7. Qt使用std::sort进行排序

    参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01 ...

  8. 非常无聊——STD::sort VS 基数排序

    众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...

  9. std::sort的详细用法

    #include <algorithm> #include <functional> #include <array> #include <iostream& ...

随机推荐

  1. servlet学习笔记一

    Servlet一.基本概念 我们的程序根据是否需要访问网络,可分为网络程序和非网络程序.而 网络程序又分为B/S结构和C/S结构. 什么是C/S?即客户端(Client)/服务器(Server)模式. ...

  2. Linux command: usermod -- 改变用户状态

    应用举例: 1. usermod -g newuser newuser force use GROUP as new primary group. 一般时候是默认的,也是必须的(不能更改).2. 指定 ...

  3. socket异步编程--libevent的使用

    使用 libevent 和 libev 提高网络应用性能 http://www.ibm.com/developerworks/cn/aix/library/au-libev/ libevent实现ht ...

  4. java web线程池

    线程池 要知道在计算机中任何资源的创建,包括线程,都需要消耗系统资源的.在WEB服务中,对于web服 务器的响应速度必须要尽可能的快,这就容不得每次在用户提交请求按钮后,再创建线程提供服务 .为了减少 ...

  5. Python3导入自定义模块的3种方式

    前话 最近跟着廖雪峰的教程学到 模块 这一节.关于如何自定义一个模块,如果大家不懂的话还请先看下面这篇博文 ↓ http://www.liaoxuefeng.com/wiki/001431608955 ...

  6. 在CentOS 7上给一个网卡分配多个IP地址

    有时你也许想要给一个网卡多个地址.你该怎么做呢?另外买一个网卡来分配地址?在小型网络中其实不用这么做.我们现在可以在CentOS/RHEL 7中给一个网卡分配多个ip地址.想知道怎么做么?好的,跟随我 ...

  7. CentOS配置SSH单向无密码访问

    最近在研究一款文件系统,需要远程给客户机安装软件,且需要无SSH密码访问,另外需要远程给客户机传文件,每次输入root密码很不方便,就想到用ssh key生成公钥.私钥来验证,而避免每次就必须输入ro ...

  8. [vim]设置vim语法高亮显示和自动缩进

    1.配置文件的位置        在目录 /etc/vim下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效.而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为 ...

  9. TopologyBuilder

    创建并提交Topology到Storm集群的完整代码 //创建TopologyBuilder对象 TopologyBuilder builder=new TopologyBuilder(); //添加 ...

  10. post提交/文件上传服务器修改

    第一步:修改在php5下POST文件大小的限制   1.编修php.ini   找到:max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,修改为: max_exec ...