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& ...
随机推荐
- SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-001-使用Hibernate(@Inject、@EnableTransactionManagement、@Repository、PersistenceExceptionTranslationPostProcessor)
一.结构 二.Repository层 1. package spittr.db; import java.util.List; import spittr.domain.Spitter; /** * ...
- sublime 支持PHP语法提示
下载插件phpcs>> https://github.com/benmatselby/sublime-phpcs 解压后修改文件夹名字为:Phpcs 把文件夹放到packages目录下 c ...
- 276. Paint Fence
题目: There is a fence with n posts, each post can be painted with one of the k colors. You have to pa ...
- ls命令详解
-a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i 节点的修改时间,并以此排序.-d 将目录 ...
- Netty4.x中文教程系列(一) 目录及概述
Netty4.x中文教程系列(一)目录及概述 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. Netty是一个NIO客户端 服务端框架 ...
- Javascript获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
/******************** * 取窗口滚动条高度 ******************/function getScrollTop(){ var scrollTop=0; ...
- asp.net收藏和设为首页的代码
1:设为首页 <a href="javascript:void(0);" id="setHomePage" onclick="this.styl ...
- Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
本博前面的文章介绍了Android开发环境的搭建和模拟器的常用操作.本次,将以Android Sample中经典的SoftKeyboard项目为例,详细解析Android上一个小型项目的开发过程和注意 ...
- 命令 tar & zip
安装zip yum install -y unzip zip: tar-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解 ...
- YTU 2614: A代码完善--系统日期
2614: A代码完善--系统日期 时间限制: 1 Sec 内存限制: 128 MB 提交: 216 解决: 113 题目描述 注:本题只需要提交填写部分的代码,请按照C++方式提交. 已知某操作 ...