【问题标题】:C++ segfault at the end of a for loop在 for 循环结束时出现 C++ 段错误
【发布时间】:2013-09-02 18:01:14
【问题描述】:

这段代码有段错误,我真的不知道为什么。当我使用 gdb 时,它会在函数末尾(花括号)出现段错误。所以这并没有给我很多关于正在发生的事情的信息。这是代码,如果需要,我会提供额外的信息。

typedef std::list<Ground> l_Ground;

void Player::y_collisions(l_Ground grounds) {
    for (l_Ground::const_iterator ent = grounds.begin(); ent != grounds.end(); ent++) {
        if (getGlobalBounds().intersects(ent->getGlobalBounds())) {
            in_air = false;
            velocity -= gravity;
        }
    }
}

编辑:经过仔细检查,它可能在 for 循环的末尾出现了段错误。由于 for 循环的编写方式,这仍然没有任何意义。它不应超出列表的末尾。

EDIT2:由于下面的答案,这将起作用。

typedef std::list<Ground> l_Ground;

void Player::y_collisions(const l_Ground& grounds) {
    for (l_Ground::const_iterator ent = grounds.begin(); ent != grounds.end(); ent++) {
        if (getGlobalBounds().intersects(ent->getGlobalBounds())) {
            in_air = false;
            velocity -= gravity;
        }
    }
}

【问题讨论】:

  • 与崩溃无关,但您确实应该通过 const-reference 传递 grounds
  • 是的,没错,我总是忘记这样做。
  • 好吧,我不知道为什么,但这解决了它。您应该将其作为答案提交,以便我接受。
  • 请注意,您不应该更改问题中的代码!现在我们看不到 const& 丢失了!
  • 好的,我会删除它。在我意识到解决了问题之前,我对其进行了更改。

标签: c++ iterator segmentation-fault


【解决方案1】:

您正在按值传递 grounds 参数。这意味着制作了一份清单副本。 显然你的Ground 类有一个损坏的复制构造函数,这使得getGlobalBounds() 方法引用了一些无效的指针,从而导致了崩溃。

你几乎不应该通过值传递一个大对象除非你想立即复制它。始终训练自己输入const &amp; :)。

【讨论】:

  • 是的,我什至还没有编写复制构造函数:P
  • 在许多情况下,默认的复制构造函数会比你自己的复制构造函数的损坏实现更好。但是,如果您的类中有裸指针,那么是的,您肯定需要一个复制运算符。
  • 是的,我刚开始这个项目,还没有开始做。我现在真的在做。我确实有原始指针,所以我迟早会需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多