std sort崩溃Crash问题解决
- 某天关于std::sort遇到了一个很奇怪的问题,描述如下。
- 问题描述:对一个vector,每次添加一个数据时,就进行std::sort排序。当进行到第16次时,必定会出现Crash。
Thread "xxxx" received signal SIGSEGV, Segmentation fault
- 问题代码:
// 比较函数
typedef struct VectorSoter{
bool operator()(const Test* first, const Test* second) {
// 问题出在这里。后面会解释
return ((first->id) <= (second->id));
}
} VECTORSORTER;
// vector对象
// Test是一个类,有一个叫id的成员变量。
std::vector<Test*> m_vector;
// 排序函数
ClassA::resortVector()
{
std::lock_guard<std::mutex> gurad(m_Lock);
if (!m_vector.empty()) {
std::sort(m_vector.begin(), m_vector.end(),
VECTORSORTER());
}
}
- 原因:问题的原因,算是一个坑了。使用std::sort时,比较函数如果是大于等于或小于等于,可能会导致越界行为发生。
If the return statement was return xxx >= xxx or xxx <= xxx ; and you used a smaller range of values, it too would probably crash.
typedef struct VectorSoter{
bool operator()(const Test* first, const Test* second) {
// 这里使用了<=。两个比较id相等时,也会返回ture。
// 这回导致std::sort进行排序时,可能出现越界问题
return ((first->id) <= (second->id));
}
} VECTORSORTER;
- 解决:std::sort的比较函数,切记仅使用小于或大于,不要使用小于等于或大于等于。
typedef struct VectorSoter{
bool operator()(const Test* first, const Test* second) {
// 这么写就没问题了。
return ((first->id) < (second->id));
}
} VECTORSORTER;