C ++:分离头文件和实现文件时的分段错误(.hpp / .cpp)

时间:2014-10-18 19:31:41

标签: c++ segmentation-fault

对于一个简单的游戏我有这个类,它会检查游戏实体前面是否有任何对象。

class FieldOfView : public anax::System<FieldOfView>
{
public:
    FieldOfView() :
    Base(anax::ComponentFilter().requires<components::Transform, components::FieldOfView>())
    {
    }

    void update()
    {
        using std::find;
        using std::begin;
        using std::end;
        using std::remove_if;

        auto& bus = Game::get().getMessageBus();

        for (auto& entity : getEntities())
        {
            auto collisions = getCollisions(entity);
            auto& inSight = entity.getComponent<components::FieldOfView>().inSight;

            for (auto& collided : collisions)
            {
                if (find(begin(inSight), end(inSight), collided) == end(inSight))
                {
                    inSight.push_back(collided);
                    bus.send<message::EntityEnteredFov>(entity, collided);
                }
            }

            std::function<bool(const anax::Entity&)> hasCollided = [&collisions](const anax::Entity& x) -> bool {
                return find(begin(collisions), end(collisions), x) != end(collisions);
            };

            for (const auto& seenEntity : inSight)
            {
                if ( !hasCollided(seenEntity) )
                    bus.send<message::EntityLeftFov>(entity, seenEntity);
            }

            inSight.erase(remove_if(begin(inSight), end(inSight), std::not1(hasCollided)), end(inSight));
        }
    }
};

该类位于“FieldOfView.hpp”文件中。它只是预期的工作。但是,我想分隔标题和实现文件,所以我创建了一个“FieldOfView.cpp”。

void FieldOfView::update()
{
    // the same code as above
}

我还更新了头文件(“FieldOfView.hpp”):

class FieldOfView : public anax::System<FieldOfView>
{
public:
    FieldOfView() :
    Base(anax::ComponentFilter().requires<components::Transform, components::FieldOfView>())
    {
    }

    void update();
};

当运行此代码(hpp + cpp)时,程序因分段错误(Segmentation fault: 11)而中止。此行中出现错误:

bus.send<message::EntityLeftFov>(entity, seenEntity);

当我使用单个hpp(没有cpp文件)编译和运行代码时,一切都很好,没有分段错误或任何其他类型的错误。我不知道是什么导致了这种行为......

1 个答案:

答案 0 :(得分:0)

旧,但是:bus是否引用Game的静态成员?好像。如果是这种情况,您将对&#34; static initialisation order fiasco&#34;因此,不同的.cpp文件可能会实例化它们自己的静态变量,与其他试图访问它们的对象相比,它们可能在它们准备就绪之前无序。

来源:它刚好发生在我身上。我有一个静态const数据集,以及一个指向该数据的指针的静态容器。在不同的翻译单元中定义这些导致了一个模糊的段错误,我原则上理解这一点,但是不会浪费时间来弄清楚确切的机制原因。因此,我将有问题的实例化移动到一个单独的cpp文件中,将它们按照正确的依赖顺序放置,一切都很好。