今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我用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); }}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航