1

这段代码是段错误的,我真的不知道为什么。当我使用 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;
        }
    }
}
4

1 回答 1

2

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

除非您想立即复制它,否则您几乎不应该按值传递一个大对象。始终训练自己打字const &:)。

于 2013-09-02T18:13:02.723 回答