Почему я получаю ошибку сегментации и EXC_BAD_ACCESS, когда я вызываю определенную функцию из допустимого указателя? - PullRequest
0 голосов
/ 27 сентября 2019

Я создаю собственную версию Atari Gravitar (https://my.ign.com/atari/gravitar) с библиотекой SFML для проекта университета, и у меня возникла ошибка сегментации (в режиме отладки она отображается как EXC_BAD_ACCESS), когда я вызываю obj->onBoundHit(bound), даже если непосредственно перед тем, как я успешно вызвал obj->getShape. Что я здесь не так делаю? Как возможно, что указатель obj действителен, но выдает ошибку сегментации, когда я обращаюсь к ней с вызовом функции onBoundHit(bound)?

Я попытался вызвать другие (виртуальные и не виртуальные) функции для этого указателя obj, и все они сделали то, что должны. Так что, похоже, проблема в onBoundsHit функции.

enum Bound {
    NO_BOUND,
    TOP_BOUND,
    LEFT_BOUND,
    RIGHT_BOUND,
    BOTTOM_BOUND
};
// Object.hpp
class Object {

    protected:
        // Attributes...

    public:
        // Some function signatures here...
        virtual void onBoundHit(Bound);
        // Other function signatures...

};

// Object.cpp
void Object::onBoundHit(Bound bound) { }
void Engine::checkBoundsHit(Object* obj) {
    FloatRect boundsRect = obj->getShape()->getGlobalBounds();
    Bound bound = NO_BOUND;
    if (boundsRect.left <= 0)
        bound = LEFT_BOUND;
    else if (boundsRect.top <= 0)
        bound = TOP_BOUND;
    else if (boundsRect.left + boundsRect.width >= game->getViewWidth())
        bound = RIGHT_BOUND;
    else if (boundsRect.top + boundsRect.height >= game->getViewHeight())
        bound = BOTTOM_BOUND;

    if (bound != NO_BOUND)
        obj->onBoundHit(bound);
}

Эта функция вызывается каждый кадр для каждого объекта в сцене, и ошибка возникает, когда я на большой планете и стреляю непрерывно (пробел, чтобы стрелять) к границе и вв то же время я ускоряюсь к этой границе с космическим кораблем. Если я отлаживаю, поврежденный объект выглядит как Bullet, который не перекрывает функцию onBoundHit(как и другие виртуальные функции в суперклассе Object, которые не переопределены в Bullet, поэтому проблема не в виртуальных функциях вообще).У меня есть общедоступный репозиторий GitHub: https://github.com/lusvelt/non-gravitar. Я был бы очень рад, если бы кто-нибудь мог помочь мне с этой проблемой, даже объяснив мне, как возможно, что есть ошибка сегментации, даже когда указатель действителен.

...