【问题标题】:The mysterious Seg. Fault神秘的赛格。过错
【发布时间】:2013-09-29 03:37:03
【问题描述】:

我有一个 Animals 类,并且从这个特定的动物派生出来。我有一个名为 mItems 的动物列表。我想看看我的狮子是否饿了。我在 Animals 类中创建了虚函数:

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

在我的 Lion 课程中,我扩展了这些:

    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 中删除项目时,它似乎出现了段错误。有什么想法吗?

【问题讨论】:

  • 使用 -g 编译并通过调试器运行。
  • 你返回 void 函数?
  • 删除您正在迭代的集合中的项目是一种危险的游戏
  • 如果列表中的指针无效,我不会感到惊讶。向我们展示您是如何创建列表和指针的。

标签: c++ segmentation-fault


【解决方案1】:

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

【讨论】:

  • 可能会有所帮助,他可以使用 list::erase 的返回值来保持他的迭代器有效,或者中断并使函数只删除第一个饥饿的狮子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多