2014-10-18 1 views
0

Для простой игры у меня есть этот класс, который проверяет, есть ли какие-либо объекты перед игровым объектом.C++: ошибка сегментации при разделении заголовка и файла реализации (.hpp/.cpp)

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 + каст) выполняется, программа прерывает из-за ошибки сегментации (Segmentation fault: 11) , Ошибка возникает в этой строке:

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

Когда я скомпилировать и запустить код, используя только одного HPP (нет каст файла) все хорошо, нет никакой ошибки сегментации или любого другого вида ошибки. Я не знаю, что вызывает такое поведение ...

+0

Угадайте, у вас есть проблема в другом месте вашего кода. Проверка переполнения буфера и использования памяти –

ответ

0

Старый, но: Does bus ссылается на статический член Game? Кажется. Если это так, вы будете нести ответственность за «static initialisation order fiasco», в результате чего различные .cpp-файлы могут создавать свои собственные статические переменные, выходить из строя по сравнению с другими объектами, которые пытаются получить к ним доступ, возможно, прежде чем они будут готовы.

Источник: Это просто случилось со мной. У меня был статический набор данных const и статический контейнер указателей на эти данные. Определение их в разных единицах перевода привело к расплывчатому segfault, который я понимаю в принципе, но не буду тратить время на то, чтобы выяснить точную механистическую причину. Итак, я переместил оскорбительные экземпляры в один файл cpp, поставил их в правильном порядке зависимости, и все было хорошо снова.

Смежные вопросы