2013-09-29 185 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的返回值來保持其迭代器的有效性,或者使該函數只刪除第一頭飢餓的獅子。 –