在基类指针上调用方法时出现分段错误

时间:2011-11-02 10:55:54

标签: c++ segmentation-fault polymorphism virtual-functions

我正在尝试为简单的编译器构建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];

即将状态置:

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 :(得分:0)

正如评论中所提到的,这个问题是由于我自己的疏忽造成的。我编辑了我的Makefile来构建其他对象,但未能在我的代码中将标题更改为新的标题。所以我将(“外部”类似的)新目标文件链接到仍使用旧标题的其他代码。