1

このコードはセグメンテーション違反であり、その理由がわかりません。gdb を使用すると、関数の最後 (中かっこ) でセグメンテーション違反が発生します。そのため、実際に何が起こっているかについて多くの情報が得られるわけではありません。これがコードです。必要に応じて追加情報を提供します。

typedef std::list<Ground> l_Ground;

void Player::y_collisions(l_Ground grounds) {
    for (l_Ground::const_iterator ent = grounds.begin(); ent != grounds.end(); ent++) {
        if (getGlobalBounds().intersects(ent->getGlobalBounds())) {
            in_air = false;
            velocity -= gravity;
        }
    }
}

編集: よく調べてみると、おそらくその for ループの最後でセグメンテーション違反が発生しています。for ループの書き方のせいで、これはまだあまり意味がありません。リストの最後を超えてはなりません。

EDIT2:これは、以下の回答のために機能します。

typedef std::list<Ground> l_Ground;

void Player::y_collisions(const l_Ground& grounds) {
    for (l_Ground::const_iterator ent = grounds.begin(); ent != grounds.end(); ent++) {
        if (getGlobalBounds().intersects(ent->getGlobalBounds())) {
            in_air = false;
            velocity -= gravity;
        }
    }
}
4

1 に答える 1

2

groundsパラメータを値渡ししていました。これは、リストのコピーが作成されたことを意味します。どうやらあなたのGroundクラスには壊れたコピーコンストラクターがあり、getGlobalBounds()メソッドが無効なポインターを参照するようになり、クラッシュが発生しました。

大きなオブジェクトをすぐにコピーしたくない場合を除き、大きなオブジェクトを値渡しすることはほとんどありません。常に入力するように常に訓練してくださいconst &:)。

于 2013-09-02T18:13:02.723 に答える