2013-09-29 3 views
0

나는 동물 클래스를 가지고 있으며,이 특정 동물로부터 파생됩니다. 나는 mItems라고 불리는 동물 목록을 가지고있다. 나는 사자가 배고픈 지보고 싶다.신비한 세그. 결함

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에서 항목을 제거하려고 할 때 segfaults 나타납니다. 어떤 아이디어?

+1

-g로 컴파일하고 디버거를 통해 실행하십시오. – Sinkingpoint

+4

void 함수를 반환합니까? – billz

+3

반복되는 컬렉션에서 항목을 삭제하면 위험한 게임이됩니다. – bengoesboom

답변

2

목록에서 항목을 제거하면 해당 항목을 가리키는 반복기가 유효하지 않습니다. https://stackoverflow.com/a/3329962/1558890을 참조하십시오. 잘못된 반복자에 i++ (또는 ++i)을 호출하면 segfault가 발생할 가능성이 있습니다.

+1

그는 list :: erase의 반환 값을 사용하여 반복기를 유효하게 유지하거나 함수를 중단시켜 첫 번째 배고픈 사자 만 삭제할 수 있음을 언급하는 데 도움이 될 수 있습니다. –