0

私は動物クラスを持っており、この特定の動物から派生しています。mItems という動物のリストがあります。ライオンがお腹を空かせているかどうかを確認したい。Animals クラスに仮想関数を作成しました。

    virtual void IsLion() {return false;}
    virtual void IsHungry() {return false;}
    virtual void SetHungry(bool state) {}

私のライオンクラスでは、これらを拡張しました:

    virtual void IsLion () {return true;}
    virtual void IsHungry () {return mHungry;}
    virtual void SetHungry () {mHungry = state;}

mHungry は、ライオンがお腹を空かせているかどうかを表すブール値のメンバー変数です。

void CSafari::KillHungryLion()
{
for(list<CAnimals *>::iterator i=mItems.begin(); 
        i != mAnimals.end();  i++) 
    {
        if((*i)->IsLion())
        {
            if((*i)->IsHungry())
            {
              mItems.remove(*i);
              delete *i;
            }

         }
    }
 }

mItems は、CAnimal オブジェクトへのポインターのリストです。

空腹のライオンは死んでいます!私が抱えている問題は、無限のセグメンテーション違反です。どこが間違っているのか特定できません。ライオンを空腹に定期的に更新するこれと本質的に同等の関数があり、これを呼び出します。mItems からアイテムを削除しようとすると、セグメンテーション違反が発生するようです。何か案は?

4

1 に答える 1

2

リストから項目を削除すると、その項目を指す反復子は無効になります。https://stackoverflow.com/a/3329962/1558890を参照してください。i++無効な反復子で(または) を呼び出す++iと、segfault が発生する可能性があります。

于 2013-09-29T03:43:19.363 に答える