2013-09-29 88 views
0

我有一个动物类,并从这个特定的动物派生。我有一个名为mItems的动物列表。我想看看我的狮子是否饿了。我在动物类创建的虚拟功能:神秘的Seg。故障

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对象的指针列表。

如果狮子饿了,他就死了!我遇到的问题是无尽的段错误。我无法确定我出错的地方。我有一个基本上相当于这个功能的功能,定期更新狮子饿,然后我称之为。看起来,当我尝试从项目中删除项目时,它会出现段错误。有任何想法吗?

+1

用-g编译并通过调试器运行。 – Sinkingpoint

+4

你返回void函数? – billz

+3

删除您正在迭代的集合中的项是一个危险的游戏 – bengoesboom

回答

2

从列表中删除项目后,指向该项目的迭代器无效。见https://stackoverflow.com/a/3329962/1558890。在无效迭代器上调用i++(或++i)可能会导致段错误。

+1

可能有助于提及他可以使用list :: erase的返回值来保持其迭代器的有效性,或者使该函数只删除第一头饥饿的狮子。 –