Ошибка сегментации при вызове метода по указателю на базовый класс - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь создать FSM для простого компилятора.
Я решил создать массив фиксированного размера с указателями интерфейса на состояния.Эта концепция оказалась успешной с простым заполнителем FSM, который читает HTML.
Однако настоящий FSM не сработает: я получаю ошибку сегментации (в 0x0) при вызове метода обработки состояний.

Вот пример:

this->states[0] = new State0();
this->states[1] = new State1();
this->states[2] = new State2();
this->states[3] = new State3();
this->states[4] = new State4();
[...]

Когда я прохожу через него, я вижу, что соответствующий адрес меняется после каждого присваивания.

Массив определяется следующим образом:

#define STATE_COUNT 17
[...]
IState * states[STATE_COUNT];

IState:

class IState {
public:
    virtual ~IState() {};
    virtual int getNextState(char) = 0;
    virtual bool isFinal() = 0;
    virtual TokenType getTokenType() = 0;
};

State0, с кодом, свернутым для целей тестирования:

class State0 : public IState
{
public:
    virtual ~State0();
    int getNextState(char c)
    {
        return 0;
    }

    bool isFinal()
    {
        return this->final;
    }

    TokenType getTokenType()
    {
        return this->tokenType;
    }
private:
    TokenType tokenType;
    bool final;
};

Теперь следующая строка кода вызывает SEGFAULT:

this->nextState = this->states[currentState]->getNextState(c);

currentState равно 0, так как оно происходит при самом первом вызове.

Итак, я думаю, что это не проблема области видимости или указатель NULL.За исключением, возможно, NULL этого указателя в объектах состояния?

1 Ответ

0 голосов
/ 04 ноября 2011

Как уже упоминалось в комментариях, эта проблема была из-за моей собственной невнимательности. Я отредактировал свой Makefile для создания других объектов, но не смог изменить заголовки на новые в моем коде. Поэтому я связал («внешне» похожие) новые объектные файлы с другим кодом, все еще используя старые заголовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...