c++排序的一个问题
2015-01-22 11:40
246 查看
开发的服务器在更新资料片后,出现了大量服务器随机崩溃的情况,经过排查问题,终于找到,
这里和大家分享一下。
首先分析错误堆栈,发现随机崩溃,怀疑是内存被覆盖,只好回头研究资料片代码,发现一个sorter的实现如下:
因为要求实现排序最后需要随机排序。所以最后脑洞大开使用随机返回的代码。
而问题就出在这里,因为std::sort要求的是严格偏序,要求相等的对象必须返回false。
http://www.cplusplus.com/reference/algorithm/sort/
而这种实现,会导致在排序过程中,对于确定相等的2个数据,在比较时会返回不同的结果,造成内存覆盖,从而导致随机崩溃。
而实际上,std::sort本身就不是稳定排序,意味着,相同的2个对象,就是会随机排序的,所以如果要稳定排序,那么要用stable_sort
修改为:
问题解决了。
这里和大家分享一下。
首先分析错误堆栈,发现随机崩溃,怀疑是内存被覆盖,只好回头研究资料片代码,发现一个sorter的实现如下:
struct SORTER { bool operator()(const OBJID& idLeft, const OBJID& idRight) { return RandGet(100) > 50; } }
因为要求实现排序最后需要随机排序。所以最后脑洞大开使用随机返回的代码。
而问题就出在这里,因为std::sort要求的是严格偏序,要求相等的对象必须返回false。
http://www.cplusplus.com/reference/algorithm/sort/
comp Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.
而这种实现,会导致在排序过程中,对于确定相等的2个数据,在比较时会返回不同的结果,造成内存覆盖,从而导致随机崩溃。
而实际上,std::sort本身就不是稳定排序,意味着,相同的2个对象,就是会随机排序的,所以如果要稳定排序,那么要用stable_sort
修改为:
struct SORTER { bool operator()(const OBJID& idLeft, const OBJID& idRight) { return false; } }
问题解决了。
相关文章推荐
- 工作当中日期排序的一个问题
- 触发器(当2个表中的相应值改变时同时改变一个表中的一个字段)(同时有处理“无法解决 equal to 操作的排序规则冲突”问题)
- 从易到难编写C++程序,(8)问题:实现一个矩阵类
- SQLServer使用identity函数生成带有自增列临时表遇到的一个排序问题
- 曾经遇到的一个另类的排序问题.
- 一个IQ问题的C++模拟
- C++派生继承中的一个问题!
- 从易到难编写C++程序,(3)问题:实现一个复杂的猜数字游戏
- zz一个VS2005无法调试C++的问题
- 为一个朋友解答的C++小问题
- 今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!
- 建了一个"symbina 技术"邮件列表,欢迎大加入到这个群,讨论symbian C++相关的技术问题!
- 排序出现的一个奇怪的问题,找出原因后差点吐血
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 用DataTable.Merge()解决了一个排序问题
- 一个公司的C/C++程序员面试问题
- 在C++的虚继承中要注意的一个传值问题
- thinking in c++ 读书笔记---友元函数的一个问题
- 请教各位一个c++问题
- SQL的一个排序问题