C++ std::sort在严格弱排序的情况下崩溃-与垃圾值相比

C++ std::sort在严格弱排序的情况下崩溃-与垃圾值相比,c++,C++,我已经编写了一个比较函数,该函数应该比较一个棋手在一个类似国际象棋的游戏中的两个可能的移动选项。每个移动包含一个应该移动的图形和一个它将移动的点。这些点已被检查,因此所有这些点都是有效的移动。当我尝试使用严格弱排序和std::sort函数对包含当前可用的所有移动的列表进行排序时,在我的比较函数在一次移动中与一些垃圾数字指针发生冲突后,我得到一个SIGSEG 我已经试着找出垃圾指针的来源,但ony发现,std::sort函数不知何故将它放在了所有其他移动的组合中。当我尝试使用std::stable

我已经编写了一个比较函数,该函数应该比较一个棋手在一个类似国际象棋的游戏中的两个可能的移动选项。每个移动包含一个应该移动的图形和一个它将移动的点。这些点已被检查,因此所有这些点都是有效的移动。当我尝试使用严格弱排序和std::sort函数对包含当前可用的所有移动的列表进行排序时,在我的比较函数在一次移动中与一些垃圾数字指针发生冲突后,我得到一个SIGSEG

我已经试着找出垃圾指针的来源,但ony发现,std::sort函数不知何故将它放在了所有其他移动的组合中。当我尝试使用std::stable_sort进行排序时,也会出现相同的seg故障。我也考虑过堆栈问题,因为我以前也有过一些,但事实也并非如此

bool cmpWhite(White_Move m1, White_Move m2) {

    if (m1.f == nullptr) {
        return true;
    } else if (m2.f == nullptr) {
        return true;
    }

    int sum1 = 0;
    double avg1 = 0;
    Figure *f1 = m1.f;
    Point origin1 = f1->getCoordinatesAsPoint();
    int sum2 = 0;
    double avg2 = 0;
    Figure *f2 = m2.f;
    Point origin2 = f2->getCoordinatesAsPoint();

    Point p;

    movePiece(field_pub, f1, m1.p);
    std::vector<Point> moves = black_king->getAllNewPossiblePositions();
    for (int i = 0; i < moves.size(); i++) {
        p = moves[i];
        if (!black_king->isPositionBlocked(field_pub, p.x, p.y)) {
            sum1++;
            // avg1 += sqrt((p.x - target_pub.x) * (p.x - target_pub.x) + (p.y - target_pub.y) * (p.y - target_pub.y));
        }
    }
    p = black_king->getCoordinatesAsPoint();
    if (!black_king->isPositionBlocked(field_pub, p.x, p.y)) {
        sum1++;
    }
    // avg1 = (double)sum1;
    movePiece(field_pub, f1, origin1);

    movePiece(field_pub, f2, m2.p);
    moves = black_king->getAllNewPossiblePositions();
    for (int i = 0; i < moves.size(); i++) {
        p = moves[i];
        if (!black_king->isPositionBlocked(field_pub, p.x, p.y)) {
            sum2++;
            // avg2 += sqrt((p.x - target_pub.x) * (p.x - target_pub.x) + (p.y - target_pub.y) * (p.y - target_pub.y));
        }
    }
    p = black_king->getCoordinatesAsPoint();
    if (!black_king->isPositionBlocked(field_pub, p.x, p.y)) {
        sum2++;
    }
    // avg2 = (double)sum2;
    movePiece(field_pub, f2, origin2);
    std::cout << "cmp: " << sum1 << " " << sum2 << std::endl;
    return sum1 < sum2;
}
boolcmpwhite(白色移动m1,白色移动m2){
如果(m1.f==nullptr){
返回true;
}else如果(m2.f==nullptr){
返回true;
}
int sum1=0;
双平均值=0;
图*f1=m1.f;
点原点1=f1->GetCoordinationsSpoint();
int-sum2=0;
双avg2=0;
图*f2=m2.f;
点原点2=f2->GetCoordinates点();
p点;
移动件(场_pub,f1,m1.p);
std::vector moves=black_king->getAllNewPossiblePositions();
对于(int i=0;iisPositionBlocked(字段pub,p.x,p.y)){
sum1++;
//avg1+=sqrt((p.x-target_pub.x)*(p.x-target_pub.x)+(p.y-target_pub.y)*(p.y-target_pub.y));
}
}
p=黑色->获取坐标点();
如果(!black\u king->isPositionBlocked(字段pub,p.x,p.y)){
sum1++;
}
//avg1=(双)sum1;
movePiece(现场酒吧,f1,原件1);
活动件(现场,f2,m2.p);
moves=black_king->getAllNewPossiblePositions();
对于(int i=0;iisPositionBlocked(字段pub,p.x,p.y)){
sum2++;
//avg2+=sqrt((p.x-target_pub.x)*(p.x-target_pub.x)+(p.y-target_pub.y)*(p.y-target_pub.y));
}
}
p=黑色->获取坐标点();
如果(!black\u king->isPositionBlocked(字段pub,p.x,p.y)){
sum2++;
}
//avg2=(双)sum2;
移动件(字段_pub,f2,原始2);

std::cout在比较函数开始时,其中一个
返回true
应该是
返回false
std::sort
的比较器必须满足此处指定的条件:。如果不是这种情况,
std::sort
将具有未定义的行为

正确的实现应该如下所示:

bool cmpWhite(White_Move m1, White_Move m2) {

    if (m1.f == nullptr) {
        return m2.f != nullptr;
    }
    if (m2.f == nullptr) {
        return false;
    }
    ...
}

显示的代码表明类型
White\u Move
可能正在管理原始指针。您实现了吗?White\u Move只是一个包含原始图形指针f和点pAlso的结构,其他将被调用的方法都经过了测试,工作正常。我已经尝试过了。如果我检查了null ptr,排序算法会给我cmp函数使用其他一些没有有效值的随机地址,因此检查实际上有点过时。此外,只有在大约100次std::sort函数调用之后,问题才会出现。
bool cmpWhite(White_Move m1, White_Move m2) {

    if (m1.f == nullptr) {
        return m2.f != nullptr;
    }
    if (m2.f == nullptr) {
        return false;
    }
    ...
}