将std::sort应用于整数向量的向量时出现Segmentation fault问题排查
问题根因与排查方案
核心原因
你遇到的段错误是因为最初传给std::sort的比较器违反了C++标准要求的严格弱序规则,导致std::sort内部触发未定义行为,出现内存越界访问。std::sort要求传入的比较函数comp(a,b)必须满足以下规则:
- 不能同时出现
comp(a,b)和comp(b,a)均为true的情况 - 若
comp(a,b)和comp(b,c)均为true,则comp(a,c)必须为true - 若两个元素相等,则
comp(a,b)和comp(b,a)必须均为false
你最初的比较器逻辑存在明显错误:当第一个元素a大于b时,你没有直接返回false,反而继续比较后续元素,会出现comp(a,b)和comp(b,a)同时为true的情况,完全不符合严格弱序要求。比如测试用例a=[5,1]、b=[3,10],你的比较器会判断comp(a,b)=true、comp(b,a)=true,直接导致std::sort运行异常。
已验证的解决方案
你后续修改的比较器完全符合严格弱序要求,逻辑正确不会触发异常。另外还可以用标准库现成的字典序比较函数简化代码,避免手写循环出错:
[](const Sort_Data<te_DataType, te_mValue>& a, const Sort_Data<te_DataType, te_mValue>& b) -> bool { return std::lexicographical_compare(a.Values.begin(), a.Values.end(), b.Values.begin(), b.Values.end()); }
后续排查建议
- 遇到
std::sort相关的段错误,第一优先级检查比较器是否符合严格弱序要求,90%以上的此类问题都是该原因导致 - 编译时开启高警告级别:GCC/Clang编译加
-Wall -Wextra参数,MSVC编译加/W4参数,部分错误的比较逻辑会被编译器提前预警 - 优先使用标准库提供的通用比较函数,减少手写逻辑出错的概率
内容的提问来源于stack exchange,提问作者niran90
相关产品推荐
相关产品推荐

