博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
今天遇到的一个诡异的core和解决 std::sort
阅读量:6515 次
发布时间:2019-06-24

本文共 1180 字,大约阅读时间需要 3 分钟。

其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题。

今天把所有代码挪到了as这里,没想到又出core了。

根据直觉,我就觉得可能是std::sort这边的问题。

 

上网一搜,果然很多提到了这个问题。

 

原来 std::sort调用的方法,在相同元素这里,不能够返回true.

因为

std::sort()的排序分2种,当元素个数>16(_S_threshold)时选择快速排序,<=16个则选择插入排序(对象少时快排性能不理想)。按照快排原理,每次都是遍历所有值和一个中间值比较,小的放左边,大的放右边。从下面STL源代码可看出,std::sort()在遍历比较时,是没有边界保护的。如果比较相等的元素返回真,则在极端情况下(如所有元素相等,__pivot为最小|最大值时)会出现访问越界,导致coredump

/// This is a helper function...  template
_RandomAccessIterator __unguarded_partition(_RandomAccessIterator __first, _RandomAccessIterator __last, _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; } }

 

参考:

http://blog.csdn.net/yyyiran/article/details/38797237

http://blog.csdn.net/stpeace/article/details/52202341

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

 

转载于:https://www.cnblogs.com/charlesblc/p/7273328.html

你可能感兴趣的文章
一张图看懂normal,static,sealed,abstract 的 区别
查看>>
Task的使用
查看>>
grep和正则表达式
查看>>
s:iterator巧妙控制跳出循环
查看>>
移动互联网思维
查看>>
redis-手写redis切片和非切片连接池并注入springboot中
查看>>
Kosaraju算法详解
查看>>
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
Android数据保存之文件保存
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
使用IIS承载WCF服务
查看>>
在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端
查看>>
Android性能优化Google课程翻译一:Render----OverDraw实战
查看>>
用Camshift算法对指定目标进行跟踪
查看>>
Tiny4412 开发板 编译环境搭建【转】
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
Android studio及eclipse中的junit单元測试
查看>>
几个英文网站
查看>>