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写compare function的注意事项)

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

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

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

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

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

  4. delete数组引发的core分析

    delete [] ptr 引发了singnal 6 abort的core错误,跟踪过程发现写入ptr大量数据,引发内存越界,破坏了new数组的尾部数据保护,导致delete的时候core. 问题分析 ...

  5. qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  6. std::bind(二)

    bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板. 用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看 ...

  7. 数据结构-bubble sort

    #gcc version 4.5.3 (GCC) #include <iostream> #include <algorithm> template <typename ...

  8. STL源码分析----神奇的 list 的 sort 算法实现

    STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序, ...

  9. hdu 1890 Robotic Sort

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 如下: #include<cstdio> #include<cstdlib&g ...

随机推荐

  1. 获取exr图片上像素点的颜色通道

    google了好久,都没找到合适的方法,还是自己撸一串吧. import OpenEXR, Imath, array def get_channel(exr_file,pixel_pos,channe ...

  2. [转]eclipse重新编译

    Eclipse打开时并不重新生成class文件,这就造成了eclipse找不到需要的class文件从而不能正常编译工程中的其他代码.此时就需要重新编译工程. 单击Project菜单,选择Clean菜单 ...

  3. HTTP 错误 403.14&ndash;Forbidden错误解决

    运行环境:开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 问题描述 ...

  4. Linux 下比较文件内容并相同部分、不同部分

    说明,是通过file2内容与file1做比较,最后列出file1与file2不同的部分! 一.准备两个文件: [root@kinggoo.com test1]# cat file1 a b c d e ...

  5. 开发一个jQuery插件——多级联动菜单

    引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...

  6. 使用Xcode6.1.1打包出现Your account already has a valid iOS Distribution certificate问题

    1.问题描述: 使用客户证书在Xcode6.1.1上进行打包测试,出现如下问题,查看网上也很多类似错误且解决办法各异. 2.我的解决办法: 让客户将开发.发布证书重新revoke掉之后重新创新并给到p ...

  7. FileUpload之FileItem

    转自:http://asialee.iteye.com/blog/706079 FileItem类主要是封装了一个File Item或者是FormItem,它的主要的方法如下,需要说明的是对于Form ...

  8. 求助 WPF ListViewItem样式问题

    求助 WPF ListViewItem样式问题 .NET 开发 > Windows Presentation Foundation Вопрос 0 Нужно войти <Style ...

  9. [POJ 1787]Charlie&#39;s Change (动态规划)

    题目链接:http://poj.org/problem?id=1787 题意:有4种货币分别是1元,5元,10元,20元.现在告诉你这四种货币分别有多少个,问你正好凑出P元钱最多可以用多少货币.每种货 ...

  10. 在线编辑器 (UBB, FCK)

    这里主要说明一下:UBB UBB 使用类型HTML的语法.  UBB相对FCK的HTML方式, 安全性高. 用户不可以直接嵌入HTML代码.   UBB 在线编辑器(JS版): http://www. ...