问题描述:
昨天一哥们些的程序,在定义比较函数的时候是这样写的
bool cmp(const T& a, const T& b)
{
if (a >= b)
return true;
return false;
}
在内部测试时,一直表现挺好,也没挂。 但一到线上,立即就挂了,打印出vector内的元素也都是正确的, 但是core在了 STL:sort里面了, 而且指针明显也是错的了。
原因分析:
stl:sort 排序 如果数据过多 才会用快速排序
所有数据进行与中间值比较的时候是无边界保护的,
当我们的容器里面所有值都相等,而comp()函数对相等返回true的时候,在进行快速排序的时候,迭代器就会越界失效。
++first 可能越界
解决办法:
bool cmp(const T& a, const T& b)
{
if (a > b)
return true;
return false;
}
effective stl 第21条:总是让比较函数在等值情况下返回false
扩展问题:
Q 在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,
你如何调试这个bug?
A: 参考 https://zhuanlan.zhihu.com/p/21348220