C++ std::sort自定义比较器使用<=触发heap buffer overflow报错
C++ sort比较器使用<=触发堆溢出的原因
核心原因:比较器不符合std::sort的严格弱序要求
C++标准明确规定,std::sort传入的自定义比较器必须满足严格弱序约束,其中最核心的一条规则是:对于任意两个相等的元素a和b,comp(a,b)和comp(b,a)必须同时返回false。
你写的比较器用了<=运算符,当两个字符串长度相等时:
mycompare(a,b) // a.size() <= b.size() 返回true mycompare(b,a) // b.size() <= a.size() 也返回true
这直接违反了严格弱序的要求,属于未定义行为。
为什么会触发堆缓冲区溢出
std::sort的内部实现(通常是快速排序、内省排序的变种)所有的迭代器移动、边界判断、元素交换逻辑都是基于比较器满足严格弱序的前提设计的。当比较器不符合要求时,算法的逻辑会出现混乱:比如本该终止的遍历循环没有终止、迭代器偏移计算错误,最终导致访问到vector容器边界以外的堆内存,触发Address Sanitizer的堆缓冲区溢出报错。
将<=替换为<后,相等长度的两个字符串调用比较器时都会返回false,完全符合严格弱序的要求,算法运行逻辑正常,就不会出现内存错误了。
内容的提问来源于stack exchange,提问作者sachin
相关产品推荐
相关产品推荐

