求解: Compare Function 在 std::sort中的錯誤~(VC6)

paynechu 2005-11-29 11:27:52
為何以下這樣簡單的做法會產生了 Runtime Error?
當數量帶到某一個數後~compare function 就會收到一個爛的pointer 而產生錯誤~
要怎樣解決呢?這是否VC6 standard library 的bug?

#include <vector>
#include <algorithm>
#include <tchar.h>
#include <windows.h>

typedef struct _SIMInfo
{
BOOL bOnline;
} SIMInfo;

std::vector<SIMInfo*> m_arr;

bool CompareFriend(SIMInfo * infox, SIMInfo * infoy)
{
bool b = infox->bOnline;
bool b2 = infoy->bOnline;
return true;
}

int main(int argc, char* argv[])
{
for (int i = 0; i < 50; ++i)
{
SIMInfo * pinfo = new SIMInfo;
memset(pinfo, 0, sizeof(SIMInfo));
m_arr.push_back(pinfo);
}

std::sort(m_arr.begin(), m_arr.end(), CompareFriend);

return 0;
}

...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
paynechu 2005-11-29
  • 打赏
  • 举报
回复
-_-" 你到底明白memset嗎?
有行過我的program明白問題嗎?
sorry...可能我問錯地方
ifeelhappy 2005-11-29
  • 打赏
  • 举报
回复
当你创建的vector存放的是pointer语意而不是reference语意的时候一定要小心谨慎

虽然有的时候这可能带来reference所不能达到便利性。
ifeelhappy 2005-11-29
  • 打赏
  • 举报
回复
你的vector存放的是指针,而在这句中memset(pinfo, 0, sizeof,(SIMInfo));
你把指针都设为NULL了,显然NULL指针提领就会出现运行期错误。

当你创建存放的pointer语意而不是reference语意的时候一定要小心谨慎
paynechu 2005-11-29
  • 打赏
  • 举报
回复
如果是因為return true 就有問題?
那即是不可以swap值了?
在實質應用裡我的compare function比這更多比較~只是放上來就簡化了它~
問題是出在..為何swap一定數量後...會有壞的pointer傳入compare function中
paynechu 2005-11-29
  • 打赏
  • 举报
回复
sorry 我的問題不是怎樣返回~
是infox or infoy 有可能傳入壞pointer令到throw runtime error
fiftymetre 2005-11-29
  • 打赏
  • 举报
回复
应该就是CompareFriend函数的return true的问题
qfeng_zhao 2005-11-29
  • 打赏
  • 举报
回复
#include <vector>
#include <algorithm>
#include <tchar.h>
#include <windows.h>

typedef struct _SIMInfo
{
BOOL bOnline;
} SIMInfo;

std::vector<SIMInfo*> m_arr;

bool CompareFriend(SIMInfo * infox, SIMInfo * infoy)
{
bool b = infox->bOnline;
bool b2 = infoy->bOnline;
return b < b2; //返回
}

int main(int argc, char* argv[])
{
for (int i = 0; i < 50; ++i)
{
SIMInfo * pinfo = new SIMInfo;
memset(pinfo, 0, sizeof(SIMInfo));
m_arr.push_back(pinfo);
}

std::sort(m_arr.begin(), m_arr.end(), CompareFriend);

return 0;
}
dragonzxh 2005-11-29
  • 打赏
  • 举报
回复
学到了,Mark
xzgyb 2005-11-29
  • 打赏
  • 举报
回复
既然是比较函数就应该有返回false的情况吧
不好意思把vc的代码拷过来
正如stanley_yue所说

template<class _RI, class _Pr> inline
void sort(_RI _F, _RI _L, _Pr _P)
{_Sort_0(_F, _L, _P, _Val_type(_F)); }

template<class _RI, class _Ty, class _Pr> inline
void _Sort_0(_RI _F, _RI _L, _Pr _P, _Ty *)
{if (_L - _F <= _SORT_MAX) // _SORT_MAX 定义为16
_Insertion_sort(_F, _L, _P);
else
{_Sort(_F, _L, _P, (_Ty *)0);
_Insertion_sort(_F, _F + _SORT_MAX, _P);
for (_F += _SORT_MAX; _F != _L; ++_F)
_Unguarded_insert(_F, _Ty(*_F), _P); }}

template<class _RI, class _Ty, class _Pr> inline
void _Sort(_RI _F, _RI _L, _Pr _P, _Ty *)
{for (; _SORT_MAX < _L - _F; )
{_RI _M = _Unguarded_partition(_F, _L, _Median(_Ty(*_F),
_Ty(*(_F + (_L - _F) / 2)), _Ty(*(_L - 1)), _P), _P);
if (_L - _M <= _M - _F)
_Sort(_M, _L, _P, _Val_type(_F)), _L = _M;
else
_Sort(_F, _M, _P, _Val_type(_F)), _F = _M; }}

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

主要就是
走到_Unguarded_partition这里
{for (; _P(*_F, _Piv); ++_F)
你的_P始终是true,就是一个死循环,当*_F访问到一个无效内存地址时
程序崩掉

;
stanley_yue 2005-11-29
  • 打赏
  • 举报
回复
sorry,不是堆排序,用的是introsort算法,跟median-of-three qsort算法类似。
stanley_yue 2005-11-29
  • 打赏
  • 举报
回复
问题出在
bool CompareFriend(SIMInfo * infox, SIMInfo * infoy)
{
bool b = infox->bOnline;
bool b2 = infoy->bOnline;
return true;
}
中的return true中,
不可能一直返回true!!!经过若干次排序后,肯定会返回false退出排序的循环。

至于,为什么少量的元素可以运行没有问题,那是因为,当元素<16个的时候,
std::sort算法,调用的是快速排序,它没有这种问题;>16个的时候,用的是
堆排序,它在一直返回true的时候,死循环,并且产生不可知的异常。
wzjall 2005-11-29
  • 打赏
  • 举报
回复
我估计是return复合值的问题。
天天向上就没问题。
至于是什么理由,还得等高手来了
oyljerry 2005-11-29
  • 打赏
  • 举报
回复
那就检查一下infox等

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧