5

ポインタを格納するコンテナがあります。ポインターが指す対応するオブジェクトのデータメンバーに基づいて、これらのポインターを増加しない順序で並べ替えようとしています。私の場合、多くのオブジェクトがそのデータ メンバーに対して同じ値を持つ可能性があります。

以下は、問題を説明するための短いコードです。sort 関数の呼び出しにより、セグメンテーション違反が発生しています。これの奇妙な点は、コンテナー内に double の同じ値を持つオブジェクトを指す 16 個の要素がある場合、並べ替えが機能しているように見えることです。しかし、同じ値を持つオブジェクトを指す要素が 17 個あると、セグ フォールトが発生します。

なぜこれが起こるのか誰でも説明できますか?

#include <iostream>
#include <algorithm>
#include <deque>

//some class
class A {
public:
    double a;
    A(double aval);
};

A::A(double aval) : a(aval) {}

//compare class
struct cmp_A : std::greater_equal<A*> {
    bool operator() (const A* x, const A* y) const;
} cmp_A_obj;

//greater_equal comparison
bool cmp_A::operator() (const A* x, const A* y) const {
    return (x->a >= y->a);
}

int main() {
    std::deque<A*> Adeque;
    //insert 17 A pointers into the container
    for(int i = 1; i<=17; i++) {
        Adeque.push_back(new A(5));
    }

    //This call to sort gives a Segmentation fault
    std::sort(Adeque.begin(), Adeque.end(), cmp_A_obj);

    for(std::deque<A*>::iterator i = Adeque.begin(); i!= Adeque.end(); i++) {
        std::cout << "|" << (*i)->a;
    }
    std::cout << std::endl;
}
4

1 に答える 1