使用lambda作为排序谓词排序pair类型vector时触发内存损坏崩溃
问题原因
std::sort要求传入的比较函数满足严格弱序规则,且签名匹配要求,你的代码崩溃是两个编译器相关的问题共同导致的:
- 你定义的lambda使用了不必要的全引用捕获
[&],但实际没有用到任何外部变量,部分编译器对这种无意义捕获的处理存在缺陷,会导致排序过程中出现内存越界,触发堆破坏。 - lambda使用C++14的泛型
auto参数,部分旧版本编译器对泛型lambda的类型推导存在bug,导致比较函数的参数类型不符合std::sort的预期,进一步引发内存访问异常。
另外你写的lambda逻辑和std::pair的默认比较逻辑完全一致:都是先比较first值,相等再比较second值,所以完全可以不用自定义lambda。
修复方案
两种方案任选其一即可:
方案1:修正lambda写法
去掉不必要的捕获,明确参数类型,避免编译器推导异常:
sort(temp.begin(), temp.end(), [](const pair<int, int>& a, const pair<int, int>& b) { return a.first != b.first ? a.first < b.first : a.second < b.second; });
方案2:直接使用默认排序
因为你的自定义逻辑和pair的默认排序逻辑完全一致,直接去掉lambda即可,代码更简洁也不会出现崩溃问题:
sort(temp.begin(), temp.end());
补充说明:编译时建议指定C++11及以上标准,比如使用gcc编译时添加参数-std=c++17,避免因标准不匹配出现未知问题。
内容的提问来源于stack exchange,提问作者nav_jan
相关产品推荐
相关产品推荐

