其实昨天开发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<typename _RandomAccessIterator, typename _Tp, typename _Compare>
_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

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
  2. Visual Studio Emulator for Android 的安装与使用 感觉最干净好看的模拟器.
  3. Kolmogorov-Smirnov检验
  4. C#之方法的重载与递归
  5. 股票k线
  6. MySQL的体系结构
  7. iOS反射机制
  8. C#&amp;java重学笔记(函数)
  9. SQL Sever 2012 如何建立数据库连接
  10. D3序
  11. [jobdu]二维数组中的查找
  12. hdu4126Genghis Khan the ConquerorGenghis Khan the Conqueror(MST+树形DP)
  13. display:table-cell的惊天作用,直接惊呆你!
  14. mac os vim 乱码
  15. Mysql学习笔记(一)数据类型
  16. PhpStorm创建Drupal模块项目开发教程
  17. 《linux内核完全剖析》笔记03-进程创建
  18. dotNet的体系结构介绍
  19. NIO的工作方式
  20. C# FTP操作类的代码

热门文章

  1. [JZOJ]100046【NOIP2017提高A组模拟7.14】收集卡片
  2. tensorflow之tf.slice()
  3. qml与c++混合编程
  4. myeclipse如何取消某一个文件的校验
  5. JS 一个简单的隔行变色函数
  6. 2015级C++第2周实践项目
  7. IOS假设将一个十六进制的color转换成UIColor,非常有用
  8. 【SPOJ-GSHOP】Rama and Friends【贪心】【细节】
  9. Python菜鸟晋级12----多线程
  10. DB-MySQL:MySQL 运算符