首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (69)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - 其他开发语言 阅读:650   评论: 3    参与评论
标题   今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!     选择自 yjgx007 的 Blog
关键字   今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!
出处  

我用VC++写了一个console程序,代码如下:
发现一旦排序值全部相同,且排序总量大于SORT_MAX,并且我自定义的函数对象:在判断两元值相等(==)时总返回true,那么,将导致排序异常(指针越界,死循环):

异常的是指针越界,为什么会导致越界,详见下文

#include "stdafx.h"
#include <afxwin.h>
#include <algorithm>
using namespace std;

class greater {
public:
 greater()
 {
 }
 bool operator ()(int x1, int x2)
 {
  ASSERT(x1 == 12); // 我在这里作了断言, 目的是判断数组越界,为什么会导致越界,详见下
  if (x1 > x2)
   return false;
  
  return true;
 }
};

int main(int argc, char* argv[])
{
// UINT arr[] = {12, 14, 31, 9, 6, 30, 11, 65, 30
// };
 UINT arr[] = {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12
 };
 int nSize = sizeof(arr)/sizeof(UINT);
 greater gt;
 sort(arr, arr+nSize, gt);
 
 for (int i = 0; i < nSize; i++)
  printf("%d\n", arr[i]);

 return 0;
}


//////////////////////////////////////////////////////////////////////////////
// 排序中运行到下面这里, 在for(;_P(*_F, _Piv);++_F)中出现了死循环,原因是我最开始讲的条件一旦全部满足(主要是_P(*_F, _Piv)总返回true), 将导致指针越界, 此外, 为何总是死循环状态, 我在进一步研究...

template<class _RI, class _Ty, class _Pr> inline
 _RI _Unguarded_partition(_RI _F, _RI _L, _Ty _Piv, _Pr _P)
 {for (; ; ++_F)
  {for (; _P(*_F, _Piv); ++_F)
   ;
  for (; _P(_Piv, *--_L); )
   ;
  if (_L <= _F)
   return (_F);
  iter_swap(_F, _L); }}


相关文章
对该文的评论
CSDN 网友 ( 2005-06-17)
Effecitve STL item 21 永远让比较函数对相同元素返回false。
CSDN 网友 ( 2005-06-13)
SORRY刚才没考虑就发表了,数组名退化了成指针了,仔细看看,想FUCTOR里面都ASSERT A=B了为什么还判断A>B等其他情况
CSDN 网友 ( 2005-06-13)
楼主知不知道SORT的第一个叠带器最起码是个INPUT ITERATOR呀?你的数组ARR头能够++吗?所以有错误是应该滴~是你的BUG而已~