std::sort引发的core
- #include <stdio.h>
- #include <vector>
- #include <algorithm>
- #include <new>
- struct foo_t
- {
- int size;
- };
- class cmp_t
- {
- public:
- bool operator()(foo_t *a, foo_t *b)
- {
- return a->size >= b->size;
- }
- };
- int main(int argc, char *argv[])
- {
- std::vector<foo_t *> vec;
- for (int i = 0; i < 17; i++)
- {
- foo_t *x = new(std::nothrow) foo_t();
- if (NULL == x)
- {
- goto fail;
- }
- else
- {
- x->size = 1;
- }
- vec.push_back(x);
- }
- std::sort(vec.begin(), vec.end(), cmp_t());
- fail:
- for(std::vector<foo_t *>::iterator iter = vec.begin(); vec.end() != iter; ++iter)
- {
- delete *iter;
- *iter = NULL;
- }
- return 0;
- }
- 然后编译
- g++ main.cpp -Werror -Wall -g
然后执行,此时系统出core,错误类型为段错误
如果无core文件产生,可以使用- ulimit -c unlimited
后重新执行一次,此时就会有core文件生成
然后- gdb a.out core
- (gdb) bt
- #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代码发现以下一段代码- /// This is a helper function...
- template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
- _RandomAccessIterator
- __unguarded_partition(_RandomAccessIterator __first,
- _RandomAccessIterator __last,
- const _Tp& __pivot, _Compare __comp)
- {
- while (true)
- {
- while (__comp(*__first, __pivot))
- ++__first;
- --__last;
- while (__comp(__pivot, *__last))
- --__last;
- if (!(__first < __last))
- return __first;
- std::iter_swap(__first, __last);
- ++__first;
- }
- }
此函数完成快速排序中分区功能,即将比哨兵小的数据放在其前,大的放在其后。
函数中使用的是
while (__comp(*__first, __pivot))
++__first;如果当比较元素相同返回真时,此时比较元素将会继续向下遍历,在极端情况下,例如程序中所有元素都是一样的情况下,在这种情况下,就会出现访问越界,结果就是导致程序出现segment fault
所以在写c++ stl中的比较函数是,bool返回真的时候,一定是“真的”大,或者小,等于的时候只能返回false。
std::sort引发的core的更多相关文章
- std::sort运行出core(segment fault)
http://note.youdao.com/noteshare?id=6aae09345e85ab55fe24ac959118a747
- 今天遇到的一个诡异的core和解决 std::sort
其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...
- 将三维空间的点按照座标排序(兼谈为std::sort写compare function的注意事项)
最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大, ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法
在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误. 这是为什么呢?原因在于什么?如何解决? 看下面一个例子: int main(int, char*[]) { st ...
- 一个std::sort 自定义比较排序函数 crash的分析过程
两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case. 注意:以下的分析都基于GCC4.4.6 一.解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的st ...
- Qt使用std::sort进行排序
参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01 ...
- 非常无聊——STD::sort VS 基数排序
众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...
- std::sort的详细用法
#include <algorithm> #include <functional> #include <array> #include <iostream& ...
随机推荐
- javaScript解决Form的嵌套
HTML是不允许FORM嵌套的,用一个简单的JAVASCRIPT就可以解决问题了 <script language=javascript> function process(v){ if( ...
- iOS开发--appstore应用上架
除了企业级的应用,一般一个应用开发完成后,都会上架App Store.其实上架流程并不繁琐,麻烦的是要耗时等待审核,如果被拒,修改后又需要等待.被拒的原因很多(真的很多…),比如程序有崩溃,适配没做好 ...
- iOS 开发--添加工程
文/Bison(简书作者)原文链接:http://www.jianshu.com/p/dd71e15df5d0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 第一部分,配置项目 在此只 ...
- CentOS下判断自己的VPS是OpenVZ的还是Xen的
一般来说,VPS的虚拟化技术,有Xen.OpenVZ.Xen HVM和VMware这几种,那么,如何判断自己的VPS是基于哪种虚拟化技术的呢? 1.执行:ls /proc/命令,一般Xen的VPS,/ ...
- python 细枝末节
1. print 自动换行 看区别 >>> for i in range(4): ... print i ... 0 1 2 3 >>> for i in ran ...
- ubuntu启动eclipse时出错cannot open display
由于要学习hadoop,就在ubuntu下创建了一个hadoop用户,但是eclipse是在naomi用户下装的,在root和naomi用户下都能正常启动,但是一旦切换到hadoop用户,试着启动ec ...
- Android内存管理(1)WRANGLING DALVIK: MEMORY MANAGEMENT IN ANDROID PART 1
from : http://www.raizlabs.com/dev/2014/03/wrangling-dalvik-memory-management-in-android-part-1-of-2 ...
- JSON(3)Google解析Json库Gson
本文参考 : http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 1.资料 官网: http://groups.goo ...
- wget 批量下载目录文件
wget -r -p -k -np http://源目录 ./本地目标目录
- 《OD学hadoop》第三周0710
一.分布式集群安装1. Hadoop模式本地模式.伪分布模式.集群模式datanode 使用的机器上的磁盘,存储空间nodemanager使用的机器上的内存和CPU(计算和分析数据) 2. 搭建环境准 ...