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& ...
随机推荐
- JavaWeb项目开发案例精粹-第6章报价管理系统-05Action层
0. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC &quo ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-002辅助类及配置文件
1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...
- 关于JLINK固件丢失或升级固件后提示Clone的解决办法
本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示.在网上找了许多关于修复的资料,都觉得不是很好.经过本人反复试验,总算找到比 ...
- linux环境下,利用tc限制两台服务器间的网速,非常简单。
最近再搞postgres的数据同步,需要模拟异地机房有带宽限制时的同步效果,所以想要限制一下两台机器之间的网速. ts命令功能很强,同时也好难理解和使用,经常浪费了好半天还是搞不定. 这里分享一个简单 ...
- css 射线实现方法
一个斜的四边形 .top_ad_out::before { content: ''; position: absolute; z-index: -1; width: 336px; height: 25 ...
- PHP 练习租房
练习:租房子 <body> <form action="test.php" method="post"> <div>区域: ...
- framework-Binder
init进程fork servicemanager进程用来提供(server)注册service和(client)检索service功能.servicemanager维护了一个service列表,cl ...
- php面向对象(二) $this
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- mysql中的去除空格函数
(1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...
- JS通用方法总结(一)
/** * id数组转换为json字符串 */ function arrayTojson(arr) { var jsonIds = "["; for ( var i = 0; i ...