for循环结束时的C ++段错误

时间:2013-09-02 18:01:15

标签: c++ iterator segmentation-fault

此代码是segfaulting,我无法弄清楚原因。当我使用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循环结束时的segfaulting。由于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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

除非想要立即复制它,否则你几乎不应该通过值传递大对象。始终训练自己始终键入const & :.